Цвет текста Android HoneyComb DatePicker

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

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


person Smillie    schedule 12.01.2012    source источник


Ответы (5)


Я нашел это решение: при отладке объекта 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);
                                }
                        }
                }
        }
}
person roger    schedule 31.07.2012

Привет :) Где-то внутри виджета выбора даты есть виджет EditText. Вы просто должны найти его. Вы можете сделать это, используя творческий код и начать поиск среди дочерних элементов виджета выбора даты, используя такие методы, как 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);

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

person Marhlder    schedule 29.01.2012
comment
где вы используете здесь детский сборщик? - person Kalpesh Lakhani; 29.03.2013

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

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

person Blundell    schedule 01.07.2012
comment
Функция setTextColorBlack() работает только один раз. Если я прокручиваю средство выбора даты, все текстовые представления становятся цветом по умолчанию, пока я не перейду к определенному полю даты, месяца или года. - person Subrata Maandal; 30.04.2015

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

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;
                            }
                        });
                    }
                }
            }
        }
    }

}
person Todd Sjolander    schedule 22.08.2012

person    schedule
comment
Отличный ответ! Я рекомендую использовать AppBaseTheme в качестве родителя Theme.SelectDate, чтобы он также работал с более низкими API. - person Vlad Schnakovszki; 07.09.2013