戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

子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 は実行される。

■ イメージ
Android_duplicateParentState.png

■ レイアウト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" の効果』に書いたように共有されるのは見た目だけなので注意してください。
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。