AppCompat を継承したテーマで EditText のデフォルトスタイルを上書きしようとして android:editTextStyle を使うと、5系以降しか適用されないという落とし穴があります。
結論
android: をつけずに editTextStyle で指定すると4系にも適用されます。ただし、parent が Widget.AppCompat.EditText の場合、5系でカーソルが白になります(解説参照のこと)。
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="editTextStyle">@style/EditTextStyle</item>
</style>
<style name="EditTextStyle" parent="Widget.AppCompat.EditText">
<item name="android:background">#ccccff</item>
</style>
</resources>
背景を変えたいだけなら android:editTextBackground と editTextBackground 両方を指定するほうが、カーソルの色を維持できます。
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextBackground">@drawable/blue</item>
<item name="editTextBackground">@drawable/blue</item>
</style>
<drawable name="blue">#ccccff</drawable>
</resources>
解説
1. デフォルトの状態
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>
</resources>
2. android:editTextStyle を指定した状態
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextStyle">@style/EditTextStyle</item>
</style>
<style name="EditTextStyle" parent="android:Widget.EditText">
<item name="android:background">#ffffff</item>
</style>
</resources>
3. editTextStyle を指定した状態
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="editTextStyle">@style/EditTextStyle</item>
</style>
<style name="EditTextStyle" parent="android:Widget.EditText">
<item name="android:background">#ffcccc</item>
</style>
</resources>
EditTextStyle の parent が android:Widget.EditText なので、4.4.2 のカーソルの色が黒になってしまっています。
4. parent が Widget.AppCompat.EditText なスタイルを editTextStyle を指定した状態
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="editTextStyle">@style/EditTextStyle</item>
</style>
<style name="EditTextStyle" parent="Widget.AppCompat.EditText">
<item name="android:background">#ccccff</item>
</style>
</resources>
今度は 5.0.0 のカーソルの色が白になった...
この白が何かというと、v12/values-v12.xml で android:textCursorDrawable に指定されている @drawable/abc_text_cursor_mtrl_alpha です。 これに accentColor で tint するのが適用されず白くなっているようです。たぶん。
<style name="Base.V12.Widget.AppCompat.EditText" parent="Base.V7.Widget.AppCompat.EditText">
<item name="android:textCursorDrawable">@drawable/abc_text_cursor_mtrl_alpha</item>
</style>
そこで、android:editTextBackground です。
android:editTextBackground
背景を変えるだけなら android:editTextBackground を指定するという方法もあります。 ただ、こちらも落とし穴があり、
- android:editTextBackground // 5系にしか適用されない
- editTextBackground // 4系にしか適用されない
という状態なので、両方指定する必要があります。
5. android:editTextBackground を指定した状態
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextBackground">@drawable/yellow</item>
</style>
<drawable name="yellow">#ffff00</drawable>
</resources>
6. editTextBackground を指定した状態
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="editTextBackground">@drawable/cyan</item>
</style>
<drawable name="cyan">#00ffff</drawable>
</resources>
7. android:editTextBackground と editTextBackground を両方指定した状態
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextBackground">@drawable/blue</item>
<item name="editTextBackground">@drawable/blue</item>
</style>
<drawable name="blue">#ccccff</drawable>
</resources>
0 件のコメント:
コメントを投稿