web-dev-qa-db-ja.com

AppCompatButton backgroundTint API <21

ボタンにリップル効果を使用したい。 AppCompat v22.1では、AppCompatの色付けにAppCompatButtonと新しい機能が追加されました。

私のレイアウト:

<Android.support.v7.widget.AppCompatButton
        Android:id="@+id/add_remove_button"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:backgroundTint="@color/primary"
        Android:textColor="@Android:color/white"
        Android:text="Remove" />

API 22テストデバイスでは、波及効果は完全に機能しますが、API 11向けにコーディングしていますが、残念ながらbackgroundTintにはAPI> = 21が必要です。古いAPIバージョンでボタンに波及効果を設定するにはどうすればよいですか?

29
Thomas Mohr

単にapp:backgroundTint の代わりに Android:backgroundTint、色合いはロリポップの下で有効になります。理由はAppCompatActivityAppCompatDelegateImplV7AppCompatViewInflaterを使用して、ButtonまたはTextViewをAppCompatButtonまたはAppCompatTextViewに自動変更してから、app:backgroundTint有効になります。

enter image description here

81
drakeet

リップルは、Android <21のビルドイン機能として使用できません。これはパフォーマンスの問題によるものです。新しいAPIを搭載したデバイスは、古いデバイスでは使用できないRenderThreadを使用できます。 http://Android-developers.blogspot.de/2014/10/appcompat-v21-material-design-for-pre.html

ロリポップ以前には波紋がないのはなぜですか? RippleDrawableをスムーズに実行できるのは、Android 5.0の新しいRenderThreadです。以前のバージョンのAndroidでパフォーマンスを最適化するために、RippleDrawableは今のところ省略しました。

2
and_dev

API 21以下のリップル機能をサポートするには、ボタンの背景にドロウアブルを追加する必要があります。

<Android.support.v7.widget.AppCompatButton
    Android:id="@+id/add_remove_button"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@drawable/button_ripple"
    Android:backgroundTint="@color/primary"
    Android:textColor="@Android:color/white"
    Android:text="Remove" />

次に、drawableとdrawable-v21の両方のディレクトリに同じ名前のxmlを追加する必要があります(それらがない場合は作成でき、自動的にリンクされます)。

/res/drawable-v21/button_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:color="@color/white">
    <item>
        <shape>
            <solid Android:color="@color/white" />
        </shape>
    </item>
</ripple>

/res/drawable/button_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <shape>
            <solid Android:color="@color/white" />
        </shape>
    </item>
</selector>
0