Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Diálogo de divisor Android

Estoy intentando cambiar el color de los divisores azules para un DatePicker en un diálogo. Esto es sólo un DialogFragment normal con un DatePicker y un ButtonBar.

¿Alguien sabe para cambiar estos divisores, o si es incluso posible sin reemplazar todo el DatePicker con uno personalizado?

Captura de pantalla DatePicker

Mini rant

Ahora he visto demasiadas respuestas que sugieren el código siguiente:

<style name="datePickerTheme" parent="@android:style/Widget.DeviceDefault.DatePicker"> <item name="android:divider">**your @drawable/ or @color/ here**</item> </style> 

Lo que simplemente no funciona. ¿Han intentado esto antes de sugerir este código? Debe funcionar perfectamente, pero no parece funcionar con DatePicker.

  • Implementar el divisor entre el último elemento del niño y el siguiente grupo de cabecera.
  • Cambiar un divisor con setDivider en un ListActivity sin un ListView personalizado?
  • Margen del divisor de vista de lista
  • Cómo quitar el divisor inferior del pie de página en una vista de lista de android
  • Establecimiento de diferentes colores de divisor para cada elemento en la vista de lista
  • Barra de acción de Android barra divisora ​​de barras
  • Eliminar divisor después de un pie de página en un ListView
  • El divisor desaparece del último elemento en listview si se agrega footerview
  • 8 Solutions collect form web for “Diálogo de divisor Android”

    El siguiente enfoque funcionó para mí. Esto establece colores divisores para todos los campos (también para am / pm)

      private void applyStyLing(TimePickerDialog timePickerDialog){ Resources system = Resources.getSystem(); int hourNumberPickerId = system.getIdentifier("hour", "id", "android"); int minuteNumberPickerId = system.getIdentifier("minute", "id", "android"); int ampmNumberPickerId = system.getIdentifier("amPm", "id", "android"); NumberPicker hourNumberPicker = (NumberPicker) timePickerDialog.findViewById(hourNumberPickerId); NumberPicker minuteNumberPicker = (NumberPicker) timePickerDialog.findViewById(minuteNumberPickerId); NumberPicker ampmNumberPicker = (NumberPicker) timePickerDialog.findViewById(ampmNumberPickerId); setNumberPickerDividerColour(hourNumberPicker); setNumberPickerDividerColour(minuteNumberPicker); setNumberPickerDividerColour(ampmNumberPicker); } private void setNumberPickerDividerColour(NumberPicker number_picker){ final int count = number_picker.getChildCount(); for(int i = 0; i < count; i++){ try{ Field dividerField = number_picker.getClass().getDeclaredField("mSelectionDivider"); dividerField.setAccessible(true); ColorDrawable colorDrawable = new ColorDrawable(mContext.getResources().getColor(R.color .interactive_color)); dividerField.set(number_picker,colorDrawable); number_picker.invalidate(); } catch(NoSuchFieldException e){ Log.w("setNumberPickerTxtClr", e); } catch(IllegalAccessException e){ Log.w("setNumberPickerTxtClr", e); } catch(IllegalArgumentException e){ Log.w("setNumberPickerTxtClr", e); } } } 

    He resuelto esto haciendo esto:

    Cambié el divisor de DatePicker con la reflexión encontrando el " mSelectionDivider ". Entonces tuve problemas con el divisor Título parecía estúpido, por lo que añadí una textview sobre el LinearLayout contiene los 3 datepickers y utiliza newFragment.setTitle(""); Para quitar el original.

    Ejemplo para el divisor dibujable: ¡ Créditos al individuo que hizo esto! 🙂 http://ge.tt/8wK7TZ71/v/0?c

    Imagen del resultado <-Mi resultado

    Ejemplo:

      public DatePickerDialog makeDatePicker(OnDateSetListener listener, Calendar cal) { Calendar c; if (cal == null) { c = Calendar.getInstance(); } else { c = cal; } int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); DatePickerDialog newFragment = new DatePickerDialog(this, listener, year, month, day); // removes the original topbar: newFragment.setTitle(""); // Divider changing: DatePicker dpView = newFragment.getDatePicker(); LinearLayout llFirst = (LinearLayout) dpView.getChildAt(0); LinearLayout llSecond = (LinearLayout) llFirst.getChildAt(0); for (int i = 0; i < llSecond.getChildCount(); i++) { NumberPicker picker = (NumberPicker) llSecond.getChildAt(i); // Numberpickers in llSecond // reflection - picker.setDividerDrawable(divider); << didn't seem to work. Field[] pickerFields = NumberPicker.class.getDeclaredFields(); for (Field pf : pickerFields) { if (pf.getName().equals("mSelectionDivider")) { pf.setAccessible(true); try { pf.set(picker, getResources().getDrawable(R.drawable.np_numberpicker_selection_divider_orange)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } } // New top: int titleHeight = 90; // Container: LinearLayout llTitleBar = new LinearLayout(this); llTitleBar.setOrientation(LinearLayout.VERTICAL); llTitleBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, titleHeight)); // TextView Title: TextView tvTitle = new TextView(this); tvTitle.setText("Select a date"); tvTitle.setGravity(Gravity.CENTER); tvTitle.setPadding(10, 10, 10, 10); tvTitle.setTextSize(24); tvTitle.setTextColor(Color.BLACK); tvTitle.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, titleHeight-2)); llTitleBar.addView(tvTitle); // View line: View vTitleDivider = new View(this); vTitleDivider.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 2)); vTitleDivider.setBackgroundColor(getResources().getColor(R.color.crumblrOrange)); llTitleBar.addView(vTitleDivider); dpView.addView(llTitleBar); FrameLayout.LayoutParams lp = (android.widget.FrameLayout.LayoutParams) llFirst.getLayoutParams(); lp.setMargins(0, titleHeight, 0, 0); return newFragment; } 

    TimePicker este código en la respuesta de Ajit , pero lo modificó para DatePicker lugar de TimePicker . Por otra parte, agregué un cheque null apenas para permanecer en el lado seguro:

     public static void colorizeDatePicker(DatePicker datePicker) { Resources system = Resources.getSystem(); int dayId = system.getIdentifier("day", "id", "android"); int monthId = system.getIdentifier("month", "id", "android"); int yearId = system.getIdentifier("year", "id", "android"); NumberPicker dayPicker = (NumberPicker) datePicker.findViewById(dayId); NumberPicker monthPicker = (NumberPicker) datePicker.findViewById(monthId); NumberPicker yearPicker = (NumberPicker) datePicker.findViewById(yearId); setDividerColor(dayPicker); setDividerColor(monthPicker); setDividerColor(yearPicker); } private static void setDividerColor(NumberPicker picker) { if (picker == null) return; final int count = picker.getChildCount(); for (int i = 0; i < count; i++) { try { Field dividerField = picker.getClass().getDeclaredField("mSelectionDivider"); dividerField.setAccessible(true); ColorDrawable colorDrawable = new ColorDrawable(picker.getResources().getColor(R.color.colorAccent)); dividerField.set(picker, colorDrawable); picker.invalidate(); } catch (Exception e) { Log.w("setDividerColor", e); } } } 

    Salida

    Divisores de colores

    Tener en cuenta:

    No necesita una nueva división R.drawable.divider

    puedes escribir:

      pf.set(number_picker, new ColorDrawable(getResources().getColor(R.color.red))); 

    Esto solucionó mi problema añadiendo debajo de la línea de código al estilo del tema de la aplicación.

     <item name="colorControlNormal">@color/colorAccent</item> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorControlNormal">@color/blue</item> </style> 

    Sí por supuesto que puedes. Por ejemplo, puede utilizar estos atributos:

     <NumberPicker android:layout_width="wrap_content" android:layout_height="wrap_content" selectionDivider="@color/black" //The divider for making the selection area selectionDividerHeight="1px"//The height of the selection divider selectionDividersDistance="3dp"//The distance between the two selection dividers internalLayout="@layout/something"//The layout of the number picker. internalMaxHeight="5dp"//The max height of the NumberPicker (also check other variations) internalMinWidth="5dp" // The max width of the NumberPicker (also check other variations) virtualButtonPressedDrawable="@drawable/something"//The drawable for pressed virtual (increment/decrement) buttons. /> 

    Actualización:

    Puede utilizar esta fecha personalizada . Es muy personalizable y competitivo hacia atrás. Básicamente utiliza numberpicker y puede establecer el divisor utilizando los atributos anteriores.

    Gracias Mvj por resolver el problema! Sólo pensé que también mostraría mi implementación de su solución en los divisores de timepickers.

      TimePickerDialog ptd = new TimePickerDialog(getActivity(), R.style.PickerStyler, this, hour, minute,DateFormat.is24HourFormat(getActivity())); ptd.setTitle(""); //Needs to be try catched Field mTimePickerField = ptd.getClass().getDeclaredField("mTimePicker"); mTimePickerField.setAccessible(true); TimePicker mTimePickerInstance = (TimePicker) mTimePickerField.get(ptd); LinearLayout llFirst = (LinearLayout) mTimePickerInstance.getChildAt(0); LinearLayout llSecond = (LinearLayout) llFirst.getChildAt(0); boolean continiue = false; NumberPicker picker = null; for (int i = 0; i < llSecond.getChildCount(); i++) { continiue = true; try{picker = (NumberPicker) llSecond.getChildAt(i); }catch(Exception e){continiue = false;} if(continiue){ Field[] pickerFields = NumberPicker.class.getDeclaredFields(); for (Field pf : pickerFields) { if (pf.getName().equals("mSelectionDivider")) { pf.setAccessible(true); try { pf.set(picker, getResources().getDrawable(R.drawable.divider)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } } } 

    Esta versión se ajusta para uso específico con DatePicker . Mientras que la versión de Andrea Lazzarotto funciona bien, utiliza un bucle innecesario que conduce a múltiples dispositivos del cambio de color. Además de las mejoras de código menores, mi versión utiliza el color principal del tema de la aplicación para que coincida con el color del divisor (consulte ¿Cómo puedo obtener el color primario del tema de mi aplicación? ). Probado con Android 6.0 y 8.0:

     private void colorizeDatePicker(final DatePicker datePicker) { final Resources system = Resources.getSystem(); final String defType = "id"; final String defPackage = "android"; final int dayId = system.getIdentifier("day", defType, defPackage); final int monthId = system.getIdentifier("month", defType, defPackage); final int yearId = system.getIdentifier("year", defType, defPackage); final NumberPicker dayPicker = (NumberPicker) datePicker.findViewById(dayId); final NumberPicker monthPicker = (NumberPicker) datePicker.findViewById(monthId); final NumberPicker yearPicker = (NumberPicker) datePicker.findViewById(yearId); setDividerColor(dayPicker); setDividerColor(monthPicker); setDividerColor(yearPicker); } private void setDividerColor(final NumberPicker picker) { if (picker == null) { return; } try { final Field dividerField = picker.getClass().getDeclaredField("mSelectionDivider"); dividerField.setAccessible(true); final TypedValue outValue = new TypedValue(); getContext().getTheme().resolveAttribute(R.attr.colorPrimary, outValue, true); final int dividerColor = outValue.data; dividerField.set(picker, new ColorDrawable(dividerColor)); picker.invalidate(); } catch (Exception e) { } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.