Android HoneyComb DatePicker Цвет текста - PullRequest
14 голосов
/ 12 января 2012

Я ищу возможность настроить цвет текста виджета «Выбор даты» в сотовом приложении для Android.Я знал, что виджет присущ глобальному цвету текста, который в моем случае белый, но мне нужен черный цвет текста для средства выбора даты, поскольку фон здесь светло-серый.

Кто-нибудь знает, как это исправить?

Ответы [ 6 ]

27 голосов
/ 22 июля 2012

СДЕЛАНО ЭТОМ

Сделал это в Теме в приложении styles.xml (в основном, установил стиль для всех полей EditText)

У меня есть это в / values-v11 /, так что это влияет только на> HC

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="Theme.SelectDate" parent="@android:style/Theme.Holo.NoActionBar">
        <item name="android:editTextStyle">@style/Widget.EditText.Black</item>
    </style>

    <style name="Widget.EditText.Black" parent="@android:style/Widget.EditText">
        <item name="android:textColor">@color/black</item>
    </style>

</resources>

Затем в моем AndroidManifest для действия, которое использует DatePicker:

      <activity
            android:name=".ui.phone.SelectDateActivity"
            android:label="Date Selection"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.SelectDate" />

Вот и все!

<Ч />

Моя тренировка :

Я пришел к такому выводу, проверив источник DatePicker:

https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/date_picker.xml

Это показало, что DatePicker использовал NumberPicker

https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/number_picker.xml https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/number_picker_with_selector_wheel.xml

NumberPicker использует EditText

Таким образом, вы можете оформить EditText

android: как изменить стиль редактирования текста?

И если вы будете искать в этом файле «editText», вы увидите, что вы можете установить стиль для всех полей edittext в одной операции!

https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/themes.xml

Вы переопределите этот пункт:

 <item name="editTextStyle">@android:style/Widget.EditText</item>
6 голосов
/ 31 июля 2012

Я нашел это решение: отлаживая объект DatePicker, я получаю объект jerarqy.Возможно, это не элегантное решение, но оно работает:

    private void setNumberPickerProperties(DatePicker dp)
{
        LinearLayout l = (LinearLayout)dp.getChildAt(0);
        if(l!=null)
        {
                l = (LinearLayout)l.getChildAt(0);
                if(l!=null)
                {
                        for(int i=0;i<3;i++)
                        {
                                NumberPicker np = (NumberPicker)l.getChildAt(i);
                                if(np!=null)
                                {
                                        EditText et = (EditText)np.getChildAt(1);
                                        et.setTextColor(Color.BLACK);
                                }
                        }
                }
        }
}
2 голосов
/ 30 января 2012

Привет! :) Где-то внутри виджета DatePicker есть виджет EditText. Вы просто должны найти это. Вы можете сделать это с помощью некоторого творческого кодирования и начать поиск по дочерним элементам виджета datepicker, используя такие методы, как getChildAt (index) и getChildCount (), а затем выполнить цикл по нему.

Вы также можете сделать что-то вроде этого, но я не уверен, что это будет работать на всех устройствах, лучше циклически проходить через детей datepickers:

DatePicker picker;
ViewGroup childpicker;

childpicker = (ViewGroup) findViewById(Resources.getSystem().getIdentifier("month" /*rest is: day, year*/,    "id", "android"));

EditText textview = (EditText)  picker.findViewById(Resources.getSystem().getIdentifier("timepicker_input", "id",  "android"));

textview.setTextColor(Color.GREEN);

Надеюсь, это поможет :)

1 голос
/ 01 июля 2012

Хм, я сделал это так:

private void hackDatePickerTextColorToBlack(){
    setTextColorBlack(datePicker);
}

private static void setTextColorBlack(ViewGroup v) {
    int count = v.getChildCount();
    for (int i = 0; i < count; i++) {
        View c = v.getChildAt(i);
        if(c instanceof ViewGroup){
            setTextColorBlack((ViewGroup) c);
        } else
        if(c instanceof TextView){
            ((TextView) c).setTextColor(Color.BLACK);
        }
    }
}

Это меняет цвет текста на черный, но осторожно с рекурсией, это может занять некоторое время.текст возвращается к белому, так что это отстой!

К вашему сведению, вот источник DatePicker: https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/date_picker.xml

EditTexts - NumberPickers

0 голосов
/ 30 апреля 2015

Функция setTextColorBlack() работает только один раз. Если я прокручиваю указатель даты, то все текстовые представления становятся цветом по умолчанию, пока я не укажу на поле определенной даты, месяца или года.

0 голосов
/ 22 августа 2012

У меня была похожая проблема, хотя я хотел изменить размер текста, но это мелочь.Я использовал тот же процесс, чтобы отделить иерархию View и изменить размер шрифта.Однако один раз в месяц (или день или год) меняли шрифт обратно на исходное значение.Отлично подходит для просмотра, плохо для редактирования.Я сделал следующий шаг и добавил слушателя изменений.Теперь, когда значение изменяется, оно возвращается к предпочтительному размеру шрифта:

public void setFontSize(final int size) {

    LinearLayout l = (LinearLayout) mPicker.getChildAt(0);
    if (l != null) {
        l = (LinearLayout) l.getChildAt(0);
        if (l != null) {
            for (int i = 0; i < 3; i++) {
                NumberPicker np = (NumberPicker) l.getChildAt(i);
                for (int x = 0; x < np.getChildCount(); x++) {
                    View view = np.getChildAt(x);
                    if ((view != null) && (view instanceof TextView)) {
                        final TextView tv = (TextView) view;
                        tv.setTextSize(size);
                        tv.setOnEditorActionListener(new OnEditorActionListener() {

                            public boolean onEditorAction(TextView v,
                                    int actionId, KeyEvent event) {
                                tv.setTextSize(size);
                                return false;
                            }
                        });
                    }
                }
            }
        }
    }

}
...