web-dev-qa-db-ja.com

Android | styles.xmlを使用してTextInputLayoutのテーマを変更する

カスタムスタイルを1つのテーマのTextInputLayout'shinterrorに適用し、グローバルに適用します。つまり、styles.xmlで定義し、アプリ全体で使用されるすべてのTextInputLayoutsに、追加せずに適用しますこのようなインライン

<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
MiaN KhaLiD

残念ながら、TextInputLayoutウィジェット、およびデザインサポートライブラリ内のすべてのウィジェットは、デフォルトスタイルのグローバルテーマ属性を定義していないようです。したがって、デフォルトのスタイルをクエリするカスタムテーマ属性をサポートするようにサブクラス化し、代わりにどこでもサブクラスを使用する以外に、スタイルをグローバルにカスタマイズすることはできません。

Widget.Design.TextInputLayout styleは、ウィジェットがテーマで定義された属性を見つけられない場合にウィジェットがフォールバックするデフォルトのスタイルとしてハードコードされているため、これはデフォルトで既存の実装と同じです。

デザインサポートライブラリの開発者には、デフォルトのテーマ属性を定義するには、正しく機能するために現在のテーマに存在する必要があるという誤解があるようです。この問題は、以前はTabLayout報告 でしたが、この理由に基づいてクローズされ、その後のクエリと説明ではそれ以上の応答は生成されませんでした。必要な説明を添えて、AOSP課題追跡システムで別のチケットを開いてください。うまくいけば、うまくいくかもしれません。

10
corsair992

私は実際にこれを使用しています

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    [...]// other definitions
    <item name="editTextStyle">@style/EditTextDefault</item>
</style>


 <style name="Widget.Design.TextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
     <item name="hintTextAppearance">@style/AppTheme.TextFloatLabelAppearance</item>
     <item name="errorTextAppearance">@style/AppTheme.TextErrorAppearance</item>
 </style>

<style name="AppTheme.TextFloatLabelAppearance" parent="TextAppearance.Design.Hint">
     <item name="Android:textColor">@color/colorAccent</item>
 </style>

 <style name="AppTheme.TextErrorAppearance" parent="TextAppearance.Design.Error">
     <item name="Android:textColor">#d32f2f</item>
 </style>

<style name="EditTextDefault" parent="Android:Widget.EditText">
    <item name="Android:paddingLeft">10dp</item>
</style>
0
Johny