0

独自のウィジェット、TextView(ラベル)とSpinnerを備えたLinearLayoutを作成しました。

XMLでは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    style="@style/MySpinner>
    <TextView android:id="@+id/label"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textStyle="bold"
        android:layout_weight="0.4"
        android:textSize="18sp"
        android:padding="8dp"
        android:enabled="false"/>
    <Spinner android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:entries="@array/thats_me_age_values"
        android:layout_weight="0.6"
        android:spinnerMode="dialog"
        android:padding="8dp"/>
</LinearLayout>

LinearLayoutは、そのスタイルを適切に使用できるように、すべてのタッチイベントを取得する必要があります(押されたときに背景が変化します)。スタイルは、background属性をこのセレクターに設定します。

<?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- pressed -->
     <item android:state_pressed="true" android:state_focused="false"> 
         <shape android:shape="rectangle" android:visible="true">
             <corners android:topLeftRadius="7dp" android:topRightRadius="7dp"/>
             <solid android:color="@color/dark_yellow"/>
             <stroke android:width="1dp" android:color="@color/grey"/>
         </shape>
     </item> 
     <!-- focused -->
     <item android:state_focused="true"> 
         <shape android:shape="rectangle" android:visible="true">
             <corners android:topLeftRadius="7dp" android:topRightRadius="7dp"/>
             <solid android:color="@color/dark_yellow"/>
             <stroke android:width="1dp" android:color="@color/grey"/>
         </shape>
     </item> 
     <!-- default -->
     <item>
         <shape android:shape="rectangle" android:visible="true">
             <corners android:topLeftRadius="7dp" android:topRightRadius="7dp"/>
             <solid android:color="@color/yellow"/>
             <stroke android:width="1dp" android:color="@color/grey"/>
         </shape>
     </item>
 </selector>

LinearLayoutのonInterceptTouchメソッドをオーバーライドしてみました。ログメッセージは押されたときに表示されますが、背景は変わりません。

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i("TOUCH", "onTouchEvent");
    return super.onTouchEvent(event);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    onTouchEvent(ev);
    Log.i("TOUCH", "onInterceptTouchEvent");
    return false;
}
4

1 に答える 1

0

android:addStatesFromChildren = "true"をLinearLayoutに追加すると、問題が解決すると思います...したがって、スピナーの線形レイアウトをクリック/フォーカスすると、状態がクリック/フォーカスに変わります。

于 2013-01-24T14:10:16.670 に答える