web-dev-qa-db-ja.com

colorControlNormalとAndroid:textColorをスタイルで設定できません

マテリアルのスタイルを設定しようとしていますEditTextビュー:

<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
    <item name="Android:textColor">@color/white</item>
    <item name="Android:textColorHint">#8AFFFFFF</item>

    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">@color/white</item>
</style>

次に、テーマにスタイルを適用します。

<style name="AppTheme">
    <item name="editTextStyle">@style/AppTheme.EditText</item>
</style>

そして、テーマをアクティビティに適用します。

  <activity
        Android:name=".MyActivity"
        Android:configChanges="keyboardHidden|orientation|screenSize"
        Android:windowSoftInputMode="stateAlwaysHidden"
        Android:theme="@style/AppTheme">

ただし、これは下線の色を変更するものではありません。

アクセントカラーを変更して下線の色を変更できることは知っていますが、他のいくつかのコントロールではアクセントカラーを変える必要があるため、これは行いたくありません。

コントロールの下線の色をこのようにスタイル設定できますか?

9

機能しない理由:colorControlNormalthemeの属性であり、Android:textColorstyle属性です。 colorControlNormalを変更するには、Themeをオーバーライドする必要があり、Android:textColor値を変更するには、styleをオーバーライドする必要があります。 @style/Widget.AppCompat.EditTextまたはその親にはcolorControlNormalという名前の属性はありません。したがって、これを行うときは何もオーバーライドしません。

<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
    <item name="colorControlNormal">@color/white</item>
</style>

解決策:colorControlNormalの値を実際に変更するには、テーマで値を変更する必要があります。アクティビティのテーマを変更せずにそれを行うには、次のことができます。

1 /変更するテーマ属性のみを使用してThemeOverlayを作成します。

<style name="AppTheme.EditText"> 
    <item name="colorControlNormal">@color/white</item>
</style>

2/EditTextビューでのみ使用します。

<EditText
    Android:layout_width="match_parent"
    Android:theme="@style/AppTheme.EditText"
/>

ここで実際に行われているのは、ビューのテーマ属性(存在する場合)が使用されることです。アクティビティのテーマはフォールバックとして使用されます。

アクティビティのテーマのcolorControlNormalをいつでも変更して、アクティビティ全体に影響を与えることができます。

28
Tin Tran

ここでは、以下の手順に従うだけで完了です。

ステップ1:スタイルを作成する

Android:textCursorDrawable属性を@nullに設定すると、カーソルの色としてAndroid:textColorが使用されます。

<style name="editTextTheme" parent="@style/Widget.AppCompat.EditText">

        <item name="Android:textColorHint">@color/white</item>

        <item name="colorControlNormal">@color/white</item>
        <item name="colorControlActivated">@color/white</item>
        <item name="colorControlHighlight">@color/white</item>

        <item name="colorAccent">@color/white</item>
        <item name="Android:textCursorDrawable">@null</item>
        <item name="Android:textColorPrimary">@color/white</item>

    </style>

ステップ2:そのスタイルをテーマとして使用する

<style name="MyTheme">
        <item name="theme">@style/editTextTheme</item>
</style>

ステップ3:そのテーマをコンポーネントに実装する

<Android.support.v7.widget.AppCompatEditText
        Android:id="@+id/editText"
        style="@style/MyTheme"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:hint="Enter Name"
        Android:inputType="textPersonName" />
2
Pranav Darji

あなたのstyle.xml:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="editTextStyle">@style/MyEditTextStyle</item>
</style>

<style name="MyEditTextStyle" parent="@style/Widget.AppCompat.EditText">
    <item name="Android:textColor">#FF0</item>
</style>

<style name="AppTheme.MyEditTextTheme">
    <item name="Android:textColorHint">#8AFFFFFF</item>

    <item name="colorControlNormal">#FF0</item>
    <item name="colorControlActivated">#FF0</item>
    <item name="colorControlHighlight">#FF0</item>
</style>

次に、EditTextのテーマとしてMyEditTextThemeを適用します。

<EditText
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/AppTheme.MyEditTextTheme"/>

これで、このEditTextでのみ黄色の下線が表示されます。また、MyEditTextThemeでcolorAccentを変更できますが、AppThemeのcolorAccent値は変更されません。

1
Zellius

この解決策は私のために働いています。 sこれは、edittextスタイルテーマのcolorControlActivatedcolorControlHighlight、およびcolorControlNormalの値をオーバーライドするだけで構成されます。他の考えとしては、カーソルの色も変更したい場合は、_Android:textCursorDrawable_このプロパティを使用します。このエディットテキストスタイルもstyle.xml(v21)に入れました。それなら、このテーマを好きなアクティビティに使用することを考えてください。以下に例を示します。

最初の解決策

_<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>
        <!--Edittext theme -->
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

<style name="App_EditTextStyle" parent="@style/Widget.AppCompat.EditText">
    <item name="Android:textColor">@color/white</item>
    <item name="Android:textColorHint">@color/black</item>

    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">@color/white</item>

    <item name="Android:backgroundTint" >@color/white</item>
    <item name="backgroundTint">@color/white</item>

    <item name="Android:textCursorDrawable">@color/white</item>
</style>
_

その他の解決策

プログラムで設定することもできます。これがAPI <21以上のソリューションです

_Drawable drawable = yourEditText.getBackground(); // get current EditText drawable 
    drawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP); // change the drawable color

    if(Build.VERSION.SDK_INT > 16) {
        yourEditText.setBackground(drawable); // set the new drawable to EditText
    }else{
        yourEditText.setBackgroundDrawable(drawable); // use setBackgroundDrawable because setBackground required API 16
    }
_
1
Shailesh

次の手順で下線の色を変更できます。

<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
    <item name="Android:textColor">@color/white</item>
    <item name="Android:textColorHint">#8AFFFFFF</item>

    <item name="Android:backgroundTint">@color/white</item>
    <item name="backgroundTint">@color/white</item>
</style>

Android Studioの警告を回避するために、item名前空間を含むAndroidを独自のstyles-v21.xmlファイルに配置する必要がありますが、100%必要というわけではありません。 。これをAPI19エミュレーターでテストしたところ、問題なく動作し、クラッシュは発生しませんでした。

0
LukeWaggoner