web-dev-qa-db-ja.com

LollipopのbackgroundTintはボタンに影響しません

アクティビティにボタンがありますが、テーマのアクセントカラーが必要です。事前にロリポップを行う必要があったように、独自のドロウアブルを作成する代わりに、当然、新しい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)は、正しく自動的に色付けされます。

78
BoD

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" />

-として出力を生成します

enter image description here

16
Sahitya Pasnoor

悪いニュース

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')の両方で機能しました。

113
Snild Dolkow

リップルドローアブルの色付けは無意味であると思われます(そしてボタンのデフォルトの背景はリップルドローアブルです)。

実際、プラットフォームのデフォルトのボタンドロアブルを見た後、これを行う「正しい」方法を見つけました。テーマでこれを定義する必要があります。

    <item name="Android:colorButtonNormal">@color/accent</item>

(もちろん、これはレベル21以降のみです。)

警告:これはテーマで定義されているため、すべてのボタン(少なくともそのテーマを使用するアクティビティのすべてのボタン)に指定された色を使用します。

ボーナスとして、これを定義することでリップルの色を変更することもできます:

    <item name="Android:colorControlHighlight">@color/accent_ripple</item>
30
BoD

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メソッドを使用します。

22
GUG

app:backgroundTintの代わりにAndroid:backgroundTintを使用するだけで、色合いはLollipopの下で有効になります。理由は、AppCompatActivityを使用してAppCompatViewInflaterを使用して、ButtonまたはTextViewをAppCompatButtonまたはAppCompatTextViewに自動的に変更し、app:backgroundTintを有効にします。

enter image description here

私のプロジェクトで使用しましたが、うまくいきました。

19
drakeet

通常、PorterDuffを使用して動的に実行します。

mbutton = (Button) findViewById(R.id.mybutton);
mbutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY);

さまざまなブレンドモードを確認できます here およびNice examples here

19
Carlos Borau

Android:backgroundを機能させるには、Android:backgroundTintを設定する必要があると思います。

より正確には、backgroundTintとして定義されているマテリアルテーマのデフォルトボタンの背景をRippleDrawableできないことを推測しています。

9
natario

同様の問題が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と機能セットを提供します


Androidサポートライブラリ22.1

AppCompatの使用時にウィジェットを自動的に色付けする機能は、アプリ全体で強力なブランディングと一貫性を維持するのに非常に役立ちます。これは、レイアウトを拡張するときに自動的に行われます-ButtonをAppCompatButtonに、TextViewをAppCompatTextViewなどに置き換えて、それぞれが色付けをサポートできるようにします。このリリースでは、これらの色合い認識ウィジェットが公開されており、サポートされているウィジェットの1つをサブクラス化する必要がある場合でも、色合いのサポートを維持できます。

3
Amit Vaghela

サポートライブラリのソースコードを調べると、通常は既知のボタンであることがわかりますが、ボタンの形状を変更すると(丸いボタンがあります)、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);
        }
2
Pavel Biryukov

Android:backgroundTintの代わりにapp:backgroundTintを使用するだけです

1
Smirnov Sergey

<Android.support.design.button.MaterialButtonバージョンでbackgroundTint"com.Android.support:design:28.0.0-rc01"を使用できます

0
Zafer Celaloglu

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'

そして今、それは再び動作します。

0
Udi Reshef

属性backgroundTintはAPIレベル21以降でのみ使用されるため

0
fedache

これが推奨されるかどうかはわかりませんが、これを試すことができます:

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を試しましたが、正常に動作していないようです。

0
sud007