2017-02-09 24 views
3

Я хочу применить собственный стиль к TextInputLayout'shint и error в одной теме и применить его глобально, то есть определить его в styles.xml и каким-то образом применить его ко всем TextInputLayouts, используемым во всем приложении, без необходимости чтобы добавить его инлайн так:Android | Измените тему TextInputLayout с помощью styles.xml

<android.support.design.widget.TextInputLayout 
    android:id="@+id/usernameWrapper" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/email_username" 
    android:textColorHint="@color/grey_text" 
    app:theme="@style/my_custom_style"> 

<style name="my_custom_style" parent="Widget.Design.TextInputLayout"> 
    <item name="android:textColorHint">@color/success_accent</item> 
    <item name="android:textSize">20sp</item> 
</style> 

Нечто подобное мы можем сделать Button виджет как это:

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="buttonStyle">@style/my.Widget.Button</item> 
    <item name="android:buttonStyle">@style/my.Widget.Button</item> 
</style> 

<style name="my.Widget.Button" parent="@android:style/Widget.TextView"> 
    <item name="android:gravity">center</item> 
    <item name="android:textSize">@dimen/some_dimen</item> 
    <item name="android:textAllCaps">false</item> 
</style> 

ПРИМЕЧАНИЕ: Я в настоящее время рассматривает подклассов TextInputLayout в крайнем случае, поэтому, пожалуйста, имейте это в виду, когда вы отвечаете.

Спасибо :)

ответ

6

К сожалению, TextInputLayout виджета, и, кажется, все виджеты в библиотеке поддержки проектирования, не определяет глобальный атрибут темы для его стиля по умолчанию. Поэтому невозможно настроить его стиль глобально, за исключением того, что он подклассифицирует его для поддержки атрибута пользовательской темы для запроса стиля по умолчанию и использования подкласса везде.

Обратите внимание, что стиль Widget.Design.TextInputLayout по-прежнему будет жестко обозначен как стиль по умолчанию, по которому виджет будет возвращаться, если он не сможет найти атрибут, определенный в его теме, поэтому это будет ничем не отличаться от существующей реализации по умолчанию ,

Похоже, что в разработчиках библиотеки поддержки дизайна есть неправильное представление о том, что определение атрибута темы по умолчанию требует присутствия в текущей теме для правильной работы. Эта проблема была reported ранее для TabLayout, но была закрыта на основе этих рассуждений, а последующие запросы и пояснения не вызвали дополнительного ответа. Не стесняйтесь открывать еще один билет на трекер AOSP с необходимыми разъяснениями; мы надеемся, что это может быть лучше.

-2

Просто мысли вслух здесь, пытались ли вы это? Это должно изменить подсказку цвета по всему вашему приложению, но если вы этого хотите, это может помочь вам в этом случае.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="android:textColorHint">@style/text_hint_appearance</item> 
</style> 

<style name="text_hint_appearance" parent="@android:style/TextAppearance"> 
    <item name="android:textColorHint">@color/success_accent</item> 
</style> 
+0

'android: textColorHint' является атрибутом стиля, а не атрибутом темы, поэтому его нельзя определить в теме. Вы имели в виду использовать атрибут темы «android: textAppearance»? Обратите внимание, что это тоже не сработает, потому что 'TextInputLayout' на самом деле является классом-оболочкой, который расширяет' LinearLayout' вместо 'EditText', и он предоставляет собственный механизм рисования подсказок, который не учитывает внешний вид текста по умолчанию. – corsair992