4567

[code]

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:orientation="horizontal">
    
      <!-- これはネットワーク経由で読み込む画像 -->
      <ImageView
          android:id="@+id/image"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          tools:src="@drawable/ic_launcher"/>
    
      <TextView
          android:id="@+id/text"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center_vertical"
          android:layout_margin="8dp"
          tools:text="hogehoge"/>
    
    </LinearLayout>
    
[/code]

上記のようなレイアウトをRecyclerViewのアイテムのレイアウトとして設定しています。  
これにセレクターを適用すると、当然ですがレイアウトの背景のみ変化するため、ImageViewの見た目はそのままになります。

ImageViewも背景と同様のセレクターの効果（全体に半透明の黒がブレンドされるようなイメージ）を適用したいと考えています。

背景はセレクター、画像はColorFilterをそれぞれ使うことでも実現は出来るのですが、

  * レイアウトが複雑になると対応が難しい（このレイアウトの中に背景色を持つViewが入った場合や、ImageViewが増えた場合など）
  * 定義場所がxml, コードに分散され保守しづらい

等の問題が有ります。

レイアウト全体に適用可能なフィルターのような機能はどのように実現するのがよいのでしょうか？

※ 前提条件として対象OSは4.0-5.0で、Material Designは今回導入しません。


CC BY-SA 3.0
2015-01-14T10:47:55.580
4550
2015-01-14T14:49:59.587
4739
question
android
リストアイテム全体に適用されるセレクターの実現方法


的外れかもしれませんが、ルートとなるレイアウトをFrameLayoutやRelativeLayoutにして、全体を覆うViewを上に重ねてしまうのはどうでしょうか？

[code]

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
         中略
        </LinearLayout>
        <View
            android:id="@+id/overlay"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/xxxx"/>
    </FrameLayout>
    
[/code]


CC BY-SA 3.0
2015-01-14T14:30:24.030
4565
2015-01-14T14:30:24.030
845
4550
answer


fkm さんの別解になりますが、`FrameLayout` の `foreground` を使う方法はいかがでしょうか。

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:foreground="@drawable/foreground_selector"
        android:clickable="true"
        android:focusable="true">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:orientation="horizontal">
            ...
    
[/code]

また、`ListView` で良ければ、`android:drawSelectorOnTop` 属性を指定する手もあります。  
<http://developer.android.com/reference/android/widget/AbsListView.html#attr_android:drawSelectorOnTop>


CC BY-SA 3.0
2015-01-14T14:49:59.587
4567
2015-01-14T14:49:59.587
4575
4550
answer