- Date: Sun 10 02 2013
- Category: Android
- Response: Comment 0 Trackback 0
子Viewが親の状態を共有:android:duplicateParentState
Android では android:duplicateParentState を使うことにより、子 View が親の状態を共有することができます。
※ 状態 = クリック、選択、有効/無効など (android:visibility は対象外)
親の状態を共有すると親が優先されるため、子 View 側の状態は無視されます。
【参考】Y.A.M の 雑記帳 - Android android:duplicateParentState
android:duplicateParentState=[true | false] はレイアウトXMLでの定義方法で、
Java側では View#setDuplicateParentStateEnabled(boolean enabled) を使います。
■ android:duplicateParentState="true" の効果
・親の状態変化を子が共有する
⇒ 親がクリックされると、子もクリックされた状態として表示される。
・子の状態は反映されない
⇒ 子が無効になっていても、親が有効であれば有効として表示される。
・イベントは共有されない
⇒ 子に onClick を設定した場合、親がクリックされても子の onClick は実行されない。
子がクリックされると onClick が実行される。
・共有されるのは見た目だけ
⇒ 親を無効にしていても、子が有効であれば子の onClick は実行される。
■ イメージ

■ レイアウトXML
■ TestLayoutActivity.java
コレはどういうときに使うのかというと…
例えば、ImageView (以下、子)をクリックするとイベントが発生するとします。
この子はクリックしたことを知らせるためにクリック中は画像が変わるようになっています。
しかし、子は小さすぎてクリックし辛いため LinearLayout 等の ViewGroup(以下、親)の中に入れ、親側に onClick イベントを設定します。
このままだと、親がクリックされても子の画像は変わりません。
そこで 子に android:duplicateParentState="true" を設定します。
すると親がクリックされたときに、子も同様にクリックされたとみなされ子がクリック中の画像に変わります。
と、レイアウトを設定する際のテクニックでした。
ただ、前述の『android:duplicateParentState="true" の効果』に書いたように共有されるのは見た目だけなので注意してください。
※ 状態 = クリック、選択、有効/無効など (android:visibility は対象外)
親の状態を共有すると親が優先されるため、子 View 側の状態は無視されます。
【参考】Y.A.M の 雑記帳 - Android android:duplicateParentState
android:duplicateParentState=[true | false] はレイアウトXMLでの定義方法で、
Java側では View#setDuplicateParentStateEnabled(boolean enabled) を使います。
■ android:duplicateParentState="true" の効果
・親の状態変化を子が共有する
⇒ 親がクリックされると、子もクリックされた状態として表示される。
・子の状態は反映されない
⇒ 子が無効になっていても、親が有効であれば有効として表示される。
・イベントは共有されない
⇒ 子に onClick を設定した場合、親がクリックされても子の onClick は実行されない。
子がクリックされると onClick が実行される。
・共有されるのは見た目だけ
⇒ 親を無効にしていても、子が有効であれば子の onClick は実行される。
■ イメージ

■ レイアウト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="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#ffcccc"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:duplicateParentState=false(default)"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#ccccff"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:text="android:duplicateParentState=true"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:id="@+id/layout3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#ccffcc"
android:gravity="center" >
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:text="android:duplicateParentState=true\nLinearLayout:Enabled=true\nTextView:Enabled=false"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
■ TestLayoutActivity.java
package jp.inujirushi.android.sample;
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
public class TestLayoutActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("android:duplicateParentState");
setContentView(R.layout.activity_layout);
// android:duplicateParentState="false"(default)
LinearLayout l1 = (LinearLayout) findViewById(R.id.layout1);
l1.setEnabled(false);
// android:duplicateParentState="true"
LinearLayout l2 = (LinearLayout) findViewById(R.id.layout2);
l2.setEnabled(false);
// android:duplicateParentState="true"
// LinearLayout:Enabled=true
// TextView:Enabled=false
TextView text3 = (TextView) findViewById(R.id.text3);
text3.setEnabled(false);
// Java 側で親の状態を参照する場合
// text3.setDuplicateParentStateEnabled(true);
}
}
コレはどういうときに使うのかというと…
例えば、ImageView (以下、子)をクリックするとイベントが発生するとします。
この子はクリックしたことを知らせるためにクリック中は画像が変わるようになっています。
しかし、子は小さすぎてクリックし辛いため LinearLayout 等の ViewGroup(以下、親)の中に入れ、親側に onClick イベントを設定します。
このままだと、親がクリックされても子の画像は変わりません。
そこで 子に android:duplicateParentState="true" を設定します。
すると親がクリックされたときに、子も同様にクリックされたとみなされ子がクリック中の画像に変わります。
と、レイアウトを設定する際のテクニックでした。
ただ、前述の『android:duplicateParentState="true" の効果』に書いたように共有されるのは見た目だけなので注意してください。
スポンサーサイト