Tengo un datepicker en mi app de Android, pero ahora quiero cambiar el color del azul divisores en verde (ver imagen debajo de este texto). Hay algunos otros los debates en Stackoverflow que habla de lo mismo, pero ninguno de ellos da una respuesta que conduce a una solución.

Así que me fui en busca de mí mismo y que se encuentran allí es en realidad un androide:datePickerStyle y también hay un android:divisor. No sé sin embargo, si el divisor es realmente se refiere a la división en el selector de fechas en absoluto. He probado multitud de combinaciones de los dos, pero me parece que no consigo que funcione. Así que mi primera pregunta: Hace el android:divisor consulte el divisor en el selector de fecha, y cómo puedo utilizarlo para cambiar de color?

Así que otra opción es supuestamente para crear una totalmente nueva costumbre de selector de fecha. Si que me permite cambiar el color del divisor estoy por ello. Así que eché un vistazo a algunos de el tutoriales en la creación de una costumbre selector de fecha, pero parece que ninguno de ellos para definir el color de los divisores. Los divisores son simplemente no aparece en los archivos xml o en los archivos de java.

Sería genial si habría algún tipo de código repetitivo para recrear el selector de fecha, ya que actualmente muestra, incluyendo el código que establece el color de los divisores. Espero que me permita copiar y simplemente cambiar la configuración de color del divisor en algún lugar. Así que mi segunda pregunta: Sería alguien sabe algún código repetitivo que simplemente implementa el selector de fecha, como lo es ahora (incluyendo una definición de los divisores)?

Android: cómo cambiar el color del selector de fecha divisor?

InformationsquelleAutor kramer65 | 2013-11-22

7 Comentarios

  1. 100

    Por desgracia, esta no es una tarea trivial.

    DatePickers utilizar los widgets de NumberPicker y CalendarView internamente. Por ejemplo, la imagen que han publicado es el uso de 3 NumberPickers. Y los divisores de usted están hablando acerca de venir de NumberPicker del atributo: selectionDivider. El problema es que este atributo no es público, y tampoco es numberPickerStyle, a través de la cual, se establece este atributo.

    Recientemente me back-portado CalendarView y NumberPicker a la API 8, sobre todo para la diversión. Ya que el código está disponible(buscar android.widget.NumberPicker y otros en android de la fuente), toda esta tarea toma tiempo, y algunos de cavar a través de android de código fuente. Ejemplos:

    1. Fácil ==> Usted tendrá que cambiar la variable privada de la Vista de la clase a sus métodos de descriptor de acceso

      mLeft (protegida de la variable en la Vista de clase) ==> getLeft() (public método de descriptor de acceso)

    2. La mayoría de tarea que consume mucho tiempo fue la restauración de los métodos de la Accesibilidad.

    En cualquier caso, si se decide por escrito implementación personalizada de selector de fecha, vas a tener que escribir para NumberPicker y CalendarView (opcionalmente) así.

    Manera más fácil:

    Portado DatePicker está disponible como una biblioteca aquí: Android-DatePicker. Como se mencionó anteriormente, usted estará usando portado CalendarView y NumberPicker en conjunción con este selector de fecha.

    Lo que usted necesita para cambiar:

    Uso {library-numberpicker} /res /drawable-xxxx /np_numberpicker_selection_divider.9.png como una plantilla, y cambiar el ‘azulado’ de color verde (yo usé pixlr). Usted puede guardar con el mismo nombre, si usted quiere hacerse con el azul del divisor por completo, o utilizar un nombre diferente y hacer cambios en {library-numberpicker} /res /values /themes.xml.

    Los cambios necesarios en themes.xml si usted elige un nombre diferente:

    <style name="NPWidget.Holo.NumberPicker" parent="NPWidget.NumberPicker">
        ....
        <item name="selectionDivider">@drawable/new_nine_path_drawable_name</item>
        ....
    </style>

    Y eso es todo.

    De salida con las bibliotecas:

    Android: cómo cambiar el color del selector de fecha divisor?

    Edición:

    Hace el android:divider consulte el divisor en el selector de fecha y
    ¿cómo puedo utilizar para cambiar de color?

    El atributo divider en realidad proviene de LinearLayout. NumberPicker hereda este atributo como NumberPicker extends LinearLayout. Pero este divider sirve para un propósito diferente. La imagen pasa a este atributo se coloca entre el niño vistas de LinearLayout.

    El atributo android:showDividers se utiliza para cambiar la colocación de este divisor, los valores posibles son:

    • ninguno: No hay divisores de muestra
    • comienzo: Divisor se muestra antes de que el primer hijo de la vista
    • medio: Divisor se muestra después de cada niño, no, no después de la última niño
    • final: Divisor se muestra después de que el último niño

    El atributo android:dividerPadding es auto-explicativo.

    Aunque NumberPicker hereda este atributo, no lo usa. Esto es evidente a partir de su propia investigación & ensayos: I tried a multitude of combinations of the two, but I don't seem to get it to work.

    Para ver el divisor de atributo en acción:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:divider="@android:drawable/ic_media_play"
        android:showDividers="middle" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="World," />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Again" />
    
    </LinearLayout>

    Hack-ish uso de solución de reflexión java:

    Esta respuesta aquí me dio la idea. Yo odio el uso de la reflexión en general, la mayoría por razones que se enumeran en esta respuesta: Enlace. Aunque estoy enumerando aquí para la integridad de sake, me sugieren no lo uso.

    public class CDP extends android.widget.DatePicker {
    public CDP(Context context, AttributeSet attrs) {
    super(context, attrs);
    Class<?> internalRID = null;
    try {
    internalRID = Class.forName("com.android.internal.R$id");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    Field month = null;
    try {
    month = internalRID.getField("month");
    } catch (NoSuchFieldException e) {
    e.printStackTrace();
    }
    NumberPicker npMonth = null;
    try {
    npMonth = (NumberPicker) findViewById(month.getInt(null));
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    Field day = null;
    try {
    day = internalRID.getField("day");
    } catch (NoSuchFieldException e) {
    e.printStackTrace();
    }
    NumberPicker npDay = null;
    try {
    npDay = (NumberPicker) findViewById(day.getInt(null));
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    Field year = null;
    try {
    year = internalRID.getField("year");
    } catch (NoSuchFieldException e) {
    e.printStackTrace();
    }
    NumberPicker npYear = null;
    try {
    npYear = (NumberPicker) findViewById(year.getInt(null));
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    Class<?> numberPickerClass = null;
    try {
    numberPickerClass = Class.forName("android.widget.NumberPicker");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    Field selectionDivider = null;
    try {
    selectionDivider = numberPickerClass.getDeclaredField("mSelectionDivider");
    } catch (NoSuchFieldException e) {
    e.printStackTrace();
    }
    try {
    selectionDivider.setAccessible(true);
    selectionDivider.set(npMonth, getResources().getDrawable(
    R.drawable.np_numberpicker_selection_divider_green));
    selectionDivider.set(npDay, getResources().getDrawable(
    R.drawable.np_numberpicker_selection_divider_green));
    selectionDivider.set(npYear, getResources().getDrawable(
    R.drawable.np_numberpicker_selection_divider_green));
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (NotFoundException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    }
    }

    Lo que hacemos aquí:

    • Extender DatePicker
    • Si abre date_picker.xml en sdk/platforms/android-xx/res/layout, verás que los tres NumberPickers tienen identificadores month, day, year. Tenemos acceso android.internal.R.id para obtener los identificadores de recursos para estos NumberPickers.
    • Que crear tres NumberPicker objetos de uso de estos identificadores con findViewById(int) método.
    • Entonces, el acceso y recuperar el Campo mSelectionDivider utilizando relection.
    • Establecer el campo accesibles (como declaró final), establece su valor de uso Field#set(Object, Object) método. El primer argumento es el Objeto que se realice esta operación. El segundo argumento es el Objeto que se desea establecer.

    La imagen que he utilizado puede ser descargado desde: aquí.

    • Potencial de simplificación: npMonth = (NumberPicker) findViewById(Resources.getSystem().getIdentifier("month", "id", "android"));?
    • ¿cómo te las arreglas para llegar a la parte superior y la parte inferior de la fecha de texto de color gris ? todo el color del texto son de color negro, para mí, usar TimePicker
    • Yo no tenía que hacer que el texto de color gris. De mirar el código fuente, NumberPicker utiliza los siguientes parámetros: TOP_AND_BOTTOM_FADING_EDGE_STRENGTH = 0.9f. Por falta de una palabra mejor, este valor es el alpha aplica a partes específicas de una View el uso de métodos sobrescritos getTopFadingEdgeStrength() y getBottomFadingEdgeStrength(). Y las partes específicas que conseguir este alfa aplicada se determina en NumberPicker#initializeFadingEdges().
    • Puesto que usted no está viendo a este efecto, comprobar net.simonvt.numberpicker.NumberPicker.java y confirmar que TOP_AND_BOTTOM_FADING_EDGE_STRENGTH es, de hecho, establece en 0.9f. También puede intentar cambiar este valor a algo dramático como 0.1f. En este caso, la parte superior e inferior textviews debe ser apenas visible.
    • se establecen para 0.9f incluso después de cambiar el valor también yo no soy capaz de ver el efecto.
    • He encontrado que el desvanecimiento de bordes es visible en dispositivos como el nexus 4 con kitkat 4.4, pero no en samsung note 2 con 4.3 ¿qué podría estar mal ?
    • Podría ser que Samsung cambiar este comportamiento. Los vendedores a menudo hacer tales cosas. No se puede hacer mucho acerca de. Tal vez usted debe buscar en la más reciente (y en mi opinión, más intuitivo) selectores de fecha y hora que forman parte de la bolsa de valores de alarma de la aplicación de reloj en el nexus 4. Hay una implementación de la biblioteca para aquellos.
    • por favor, echa un vistazo a stackoverflow.com/questions/27544613/…
    • Por favor, añade una nota de la configuración de CDP en archivo xml o llamarlo Como un nuevo selector de fecha.

  2. 24

    Creo que la solución más sencilla es probablemente el uso de estilos.

    Acaba de poner esto en su styles.xml documento

        <!-- changes the default colours for EditTexts, including non-text elements (also works with the DatePicker -->
    <style name="appCompatStyle" parent="Theme.AppCompat.Light">
    <item name="colorControlNormal">@color/lightPrimaryText</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="android:editTextStyle">@style/editTextStyle</item>
    </style>
    <!-- changes the default text colour for the EditTexts -->
    <style name="editTextStyle" parent="android:style/Widget.EditText">
    <item name="android:textColor">@color/lightPrimaryText</item>
    </style>

    y poner estos atributos en el layout XML

    android:theme="@style/appCompatStyle"

    y personalizar como más te guste.

    • En Android 4.3 y 4.4 no funciona en android 5 y por encima – de las grandes obras
    • Esto no cambia el divisores de’ el color de la API de 21
  3. 3

    Hay una biblioteca han custmize tiempo y selector de fecha. En que usted puede cambiar el color de divisor de la siguiente manera

        timePicker.setSelectionDivider(new ColorDrawable(0xffff0000));
    timePicker.setSelectionDividerHeight(2);

    Editar
    Otro biblioteca también he utilizado la que también es bueno para uno en el que usted puede personalizar utilizando la siguiente manera en thems.xml

    <style name="NPWidget.Holo.NumberPicker" parent="NPWidget.NumberPicker">
    <item name="solidColor">@android:color/transparent</item>
    <item name="selectionDivider">@color/div_color</item>
    <item name="selectionDividerHeight">0.3dip</item>
    <item name="internalLayout">@layout/number_picker_with_selector_wheel</item>
    <item name="internalMinWidth">64dip</item>
    <item name="internalMaxHeight">140dip</item>
    <item name="virtualButtonPressedDrawable">@drawable/item_background_holo_dark</item>
    </style>
    • la biblioteca se bloquea con raras excepciones
    • alternativa, puede utilizar este github.com/SingleCycleKing/CustomTimePicker
    • CustomTimePicker uno puede personalizar al 100% tu propio camino. Yo la uso y de trabajo encanto
  4. 3

    Configuración de un tema a DatePicker diseño y la adición de colorControlNormal a mí me funciona.

    En el layout xml de añadir un DatePicker de aplicar un tema, como se muestra a continuación –

    <DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
    android:theme="@style/NumberPickerStyle"
    android:datePickerMode="spinner"
    android:calendarViewShown="false"
    android:layout_gravity="center_horizontal"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"/>

    y, a continuación, definir el NumberPickerStyle en styles.xml especificando colorControlNormal como este –

    <style name="NumberPickerStyle">
    <item name="colorControlNormal">@color/colorAccent</item>
    </style>
  5. 0

    Primero de todos; Vikram, que hizo un gran trabajo, gracias por su esfuerzo! Una cosa que me faltaba en net.simonvt.datepicker.DatePickerDialog fue la opción para establecer el titleDivider color que quiero para que coincida con numberPickerDividerColor. Así que he añadido esta opción en Vikrams implementación y estoy publicando aquí. Es una solución común en relación con los cambios AlertDialog.titleDividerColor. Tal vez pueda ayudar a alguien.

    class net.simonvt.datepicker.DatePickerDialog
    private int titleDividerColor;

    Es importante para establecer el color cuando el cuadro de diálogo que se muestra, así que hacer esto en onAttachedToWindow método.

    @Override
    public void onAttachedToWindow() {
    super.onAttachedToWindow();
    if (titleDividerColor <= 0) { return; }
    try {
    int dividerId = getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
    View divider = findViewById(dividerId);
    if (divider != null) {
    divider.setBackgroundColor(getContext().getResources().getColor(titleDividerColor));
    }
    } catch (Exception e) {}
    }
    public void setTitleDividerColor(int titleDividerColor) {
    this.titleDividerColor = titleDividerColor;
    }
    public int getTitleDividerColor() {
    return titleDividerColor;
    }

    EDITAR

    He publicado otra solución aquí https://stackoverflow.com/a/33800696/1134335

  6. 0

    Por el solo hecho de cambiar el divisor de color en DatePickerDialog el cambio de android:datePickerDialogTheme estilo en tu tema es suficiente:

    Estilo de tema:

     <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:datePickerDialogTheme">@style/style_date_picker_dialog</item>
    </style>

    De diálogo estilo:

    <style name="style_date_picker_dialog" parent="AppCompatAlertDialogStyle">
    <item name="colorControlNormal">@color/colorAccent</item>
    </style>
    • android:datePickerDialogTheme es para API >=21
  7. -4

    De wrecker en Android divisor de color del cuadro de diálogo selector de fecha

    Puede usar estos atributos, por ejemplo:

    <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.
    />

Dejar respuesta

Please enter your comment!
Please enter your name here