アクティビティにボタンがありますが、テーマのアクセントカラーが必要です。事前にロリポップを行う必要があったように、独自のドロウアブルを作成する代わりに、当然、新しいbackgroundTint
属性を使用したいと思います。
<Button
Android:id="@+id/btnAddCode"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:backgroundTint="@color/accent"
Android:text="@string/addressInfo_edit_addCode" />
残念ながら、効果はありません。ボタンは灰色のままです。
backgroundTintMode
に別の値を試しましたが、何も変わりませんでした。
また、アクティビティでプログラム的に実行しようとしましたが、何も変わりませんでした。
addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList(
getResources().getColorStateList(R.color.accent));
なぜ私の色合いが無視されるのですか?
編集:明確にするために、私は実際にLollipopデバイスでテストしています。他のウィジェット(例:EditText)は、正しく自動的に色付けされます。
API 19〜API 27でテスト済み
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.AppCompatButton
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
style="@style/Widget.AppCompat.Button.Colored"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/retry"
Android:textColor="@Android:color/white"
app:backgroundTint="@Android:color/holo_red_dark" />
-として出力を生成します
BoDが言うように、Lollipop 5.0(APIレベル21)でButtonの背景に色を付けることは無意味です。
Lollipop 5.1(APIレベル22)は、btn_mtrl_default_shape.xml(他のファイルも含む)を変更することでこれを修正したようです: https://Android.googlesource.com/platform/frameworks/base/+/6dfa60f33ca6018959ebff1efde82db7d2aed1e3%5E!/#F
新しいサポートライブラリ(バージョン22.1以降) 下位互換性のある色付けサポートを追加AppCompatButton を含む多くのコンポーネントに!
残念ながら、Android:backgroundTint
プロパティはまだ機能しません(おそらく何か間違っているのでしょう)-- setSupportBackgroundTintList()
を使用して、コードでColorStateList
を設定する必要があります。 Android:backgroundTint
が将来サポートされるようになるのは本当に素晴らしいことです。 Update:Marcio Granzottoさんは、app:backgroundTint
がAppCompatButtonで動作するとコメントしました!アプリ/ライブラリにあるため、app:
ではなくAndroid:
であることに注意してください。
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<AppCompatButton
Android:id="@+id/mybutton"
Android:layout_width="wrap_content" Android:layout_height="wrap_content"
Android:text="Testing, testing"
app:backgroundTint="#ff00ff"/>
</LinearLayout>
AppCompatButton
から継承した場合、アクティビティは通常のButton
ではなくAppCompatActivity
を自動的に膨張させます。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCompatButton v = (AppCompatButton) findViewById(R.id.mybutton);
ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
v.setSupportBackgroundTintList(csl);
}
}
もちろん、カラーリソースからColorStateList
を取得する必要がありますが、私は怠けていたので...
ああ、アプリのテーマのベースをTheme.AppCompat
テーマの1つにすることを忘れないでください。そうしないと、compatビューが非常に悲しくなります...;)
これは、2.3.7(Gingerbread MR1)と5.0(Lollipop 'Classic')の両方で機能しました。
リップルドローアブルの色付けは無意味であると思われます(そしてボタンのデフォルトの背景はリップルドローアブルです)。
実際、プラットフォームのデフォルトのボタンドロアブルを見た後、これを行う「正しい」方法を見つけました。テーマでこれを定義する必要があります。
<item name="Android:colorButtonNormal">@color/accent</item>
(もちろん、これはレベル21以降のみです。)
警告:これはテーマで定義されているため、すべてのボタン(少なくともそのテーマを使用するアクティビティのすべてのボタン)に指定された色を使用します。
ボーナスとして、これを定義することでリップルの色を変更することもできます:
<item name="Android:colorControlHighlight">@color/accent_ripple</item>
Android 5.0.xの色付けに関連する問題を解決するには、次のようなものを使用します。
public static void setButtonTint(Button button, ColorStateList tint) {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Lollipop && button instanceof AppCompatButton) {
((AppCompatButton) button).setSupportBackgroundTintList(tint);
} else {
ViewCompat.setBackgroundTintList(button, tint);
}
}
API 21のサポートメソッドのみを使用し、他のすべてのケースではViewCompatメソッドを使用します。
app:backgroundTint
の代わりにAndroid:backgroundTint
を使用するだけで、色合いはLollipopの下で有効になります。理由は、AppCompatActivity
を使用してAppCompatViewInflater
を使用して、ButtonまたはTextViewをAppCompatButtonまたはAppCompatTextViewに自動的に変更し、app:backgroundTint
を有効にします。
Android:background
を機能させるには、Android:backgroundTint
を設定する必要があると思います。
より正確には、backgroundTint
として定義されているマテリアルテーマのデフォルトボタンの背景をRippleDrawable
できないことを推測しています。
同様の問題がGoogleで報告されました https://code.google.com/p/Android/issues/detail?id=20187
しかし、Android Support Libraryのリリース後、リビジョン 23.2.1 (2016年3月)このバグは解決されました。
問題:FloatingActionButton.setBackgroundTintList(@Nullable ColorStateList tint)は背景色を変更しなくなりました
サポートライブラリをAndroid Support Library to 23.2.1
に更新します
design support library(23.2.1)およびappcompatwidgetsを以下のように使用します
AppCompat(別名ActionBarCompat)は、Gingerbreadで実行されるデバイス用のAndroid 4.0 ActionBar APIのバックポートとして始まり、バックポート実装およびフレームワーク実装の上に共通のAPIレイヤーを提供します。 AppCompat v21は、Android 5.0で最新のAPIと機能セットを提供します
AppCompatの使用時にウィジェットを自動的に色付けする機能は、アプリ全体で強力なブランディングと一貫性を維持するのに非常に役立ちます。これは、レイアウトを拡張するときに自動的に行われます-ButtonをAppCompatButtonに、TextViewをAppCompatTextViewなどに置き換えて、それぞれが色付けをサポートできるようにします。このリリースでは、これらの色合い認識ウィジェットが公開されており、サポートされているウィジェットの1つをサブクラス化する必要がある場合でも、色合いのサポートを維持できます。
サポートライブラリのソースコードを調べると、通常は既知のボタンであることがわかりますが、ボタンの形状を変更すると(丸いボタンがあります)、api <= 21で色合いがうまく機能しません。また、TintManagerがパブリッククラス(appcompat-v7:23.1.1)になったことがわかります。そのため、現在のテーマのデフォルトのボタン形状(5.0では大丈夫です)からColorStateListを取得できます(配列を作成する必要はありません)色の):
Context c = ...; // activity
AppCompatButton ab = ...; // your button
// works ok in 22+:
if (Build.VERSION.SDK_INT <= 21) {
// default appcompat button, that is tinted ok with current theme colors "abc_btn_default_mtrl_shape":
// ColorStateList tint = TintManager.get(c).getTintList(R.drawable.abc_btn_default_mtrl_shape);
// Appcompat 23.2 change:
ColorStateList tint = AppCompatDrawableManager.get().getTintList(c, R.drawable.abc_btn_default_mtrl_shape);
ab.setSupportBackgroundTintList(tint);
}
Android:backgroundTintの代わりにapp:backgroundTintを使用するだけです
<Android.support.design.button.MaterialButton
バージョンでbackgroundTint
"com.Android.support:design:28.0.0-rc01"
を使用できます
Recyclerviewのほとんどの更新されたlibがこのバグを引き起こす可能性があることに注意してください。
このコマンド
sendBtnView.setBackgroundTintList(colorState)
過去に完璧に働いたが、私のために働くのをやめる。研究の後、原因はgradle依存関係に追加されたlibであることが判明しました:
compile 'com.Android.support:recyclerview-v7:+'
そこで、Amit Vaghelaの投稿で推奨されているように、23.02.1に変更しようとしました。に変更しました
compile 'com.Android.support:recyclerview-v7:23.02.1'
しかし、gradleエラーは、recyclerview libにこのバージョン(23.02.1)がないことを示しました(gradleはJcenter raw.githubまたはrepoで見つけることができませんでした)。
それから、私はsetBackgroundTintListコマンドが私がgradle依存関係にある他のすべてのライブラリのバージョン22.02.0で過去にうまく動作するのを知っていたので。だから私はそれを次のように変更します:
compile 'com.Android.support:recyclerview-v7:22.02.0'
そして今、それは再び動作します。
属性backgroundTint
はAPIレベル21以降でのみ使用されるため
これが推奨されるかどうかはわかりませんが、これを試すことができます:
Drawable newDrawable = mBtnAction.getBackground(); // obtain Bg drawable from the button as a new drawable
DrawableCompat.setTint(newDrawable, mActivity.getHomeTobBarBGColor()); //set it's tint
mBtnAction.setBackground(newDrawable); //apply back to button
一般的な意味では機能します。 ViewCompat
を試しましたが、正常に動作していないようです。