11

次のように、Spinner ドロップダウン項目に波及効果を適用しようとしました。

アクティビティ.java

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.array_name, R.layout.simple_spinner_dropdown_item);
    adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
    Spinner mSpinner = (Spinner) findViewById(R.id.spinner);
    mSpinner.setAdapter(adapter);

simple_spinner_dropdown_item.xml

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@drawable/spinner_ripple"
   android:ellipsize="marquee"
   android:gravity="center_horizontal"
   android:padding="10dip"
   android:singleLine="true"
   android:textSize="14sp" />

spinner_ripple.xml

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

ただし、ドロップダウンリストでは、最初のアイテムに対してのみ機能し、現在選択されているアイテムが最初のアイテムとは別のアイテムである場合にのみ機能します。それ以外の場合はすべて、背景アイテムを波紋色で塗りつぶします (波及効果はありません)。私のコードはどこが間違っていますか?

すでに試しました:次のように、ドロップダウンアイテムレイアウトの背景に固定色を設定し、スピナー要素の下に波及効果を移動することはできません:

simple_spinner_dropdown_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@android:color/white"
   android:ellipsize="marquee"
   android:gravity="center_horizontal"
   android:padding="10dip"
   android:singleLine="true"
   android:textSize="14sp" />

activity_layout.xml

<Spinner
   android:id="@+id/spinner"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:drawSelectorOnTop="true"
   android:dropDownSelector="@drawable/spinner_ripple" />
4

3 に答える 3

5

ドロップダウン リストの項目をデフォルトで白にして、ユーザーが触れたときだけリップル効果で強調表示する場合は、spinner_ripple.xmlドローアブルに適切な状態リストを実装する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <ripple android:color="?android:attr/colorControlHighlight" />
    </item>
    <item android:state_pressed="false">
        <shape>
            <solid android:color="@android:color/white" />
        </shape>
    </item>
</selector>

ここでandroid:state_pressed="true"は、ユーザーが実際にビューを押したときにのみセレクター項目が適用されることを意味します。他のセレクター状態をサポートしたい場合は、StateListDrawableリファレンスをチェックしてください。

公式のAndroid 開発者ブログによると、AppCompat-v7 v21 は波及効果をサポートしていないことに注意してください。

Lollipop 導入前にさざ波がないのはなぜですか? RippleDrawable のスムーズな実行を可能にするものの多くは、Android 5.0 の新しい RenderThread です。以前のバージョンの Android でのパフォーマンスを最適化するために、現時点では RippleDrawable を除外しています。

したがって、Lollypop でのみ機能します。

于 2015-01-17T13:47:54.570 に答える
0

あなたには2つのレイヤーが必要だと思いますspinner_ripple.xml

<!-- Background -->
<ripple android:color="#ff00ff00">
    <item android:drawable="@android:color/black" />
<ripple />

<!-- Ripple color -->
<ripple android:color="#ff00ff00">
    <item android:drawable="@android:color/white" />
<ripple />
于 2015-01-13T15:03:44.497 に答える