marunomaruno-memo

marunomaruno-memo

[Android] レイアウト (5) レイアウトの組込み - include

2012年03月24日 | Android
[Android] レイアウト (5) レイアウトの組込み - include
================================================================================

他のレイアウトの XML ファイルを、自身の中に組み込むことができる。
このためには、
    <include layout="@layout/XMLファイル名" />
要素を使う。


・属性

layout
    レイアウトリソース。 必須。レイアウトリソースに対する参照。

android:id
    リソース ID。インクルードされたレイアウトのルート要素のビューで指定された ID
 はこれで上書きされる。

android:layout_height, android:layout_width
    ディメンションまたはキーワード。インクルードされたレイアウトのルート要素のビ
ューで指定された高さ、幅はこれで上書きされる。 

インクルードされたレイアウトのルート要素でサポートされていれば、 <include> には
他のレイアウト属性を含めることが可能で、それらはルート要素で定義されたものを上書
きする。


□ 参考
ソフトウェア技術ドキュメントを勝手に翻訳
Android 開発ガイド > フレームワークトピック > 7. アプリケーションリソース > 
7.5 リソースタイプ > 
7.5.4 レイアウトリソース 
http://www.techdoctranslator.com/android/guide/resources/available-resources/layout-resource


▲ レイアウト

3x3 のテーブルのレイアウトを定義する。このとき、1 行分を定義する row.xml、1 項目
分を定義する item.xml を用意し、include 要素で引っ張ってきている。

    main.xml    TableLayout 要素でテーブルを定義。3 つの row.xml を参照している
    row.xml     TableRow 要素で行を定義。3 つの item.xml を参照している
    item.xml    ToggleButton 要素

□ res/layout/main.xml
---
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TableLayout
        android:id="@+id/tableLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dip"
        android:weightSum="1" >

        <include android:id="@+id/row0" layout="@layout/row" />
        <include android:id="@+id/row1" layout="@layout/row" />
        <include android:id="@+id/row2" layout="@layout/row" />
        
    </TableLayout>

</LinearLayout>
---


1 行分の定義

□ res/layout/row.xml
---
<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <include android:id="@+id/button0" layout="@layout/item" />
    <include android:id="@+id/button1" layout="@layout/item" />
    <include android:id="@+id/button2" layout="@layout/item" />
    
</TableRow>
---


1 項目分の定義

□ res/layout/item.xml
---
<?xml version="1.0" encoding="utf-8"?>
<ToggleButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="onClick"
    android:textAppearance="?android:attr/textAppearanceLarge"
 />
---


▲ アクティビティ

ボタンがクリックされたら、その状態によって、ボタンの幅と高さを倍にするか半分にす
る。

コードは LinearLayout01Activity.java と同じであるが、末端のウィジェットを区別す
るのに、getId() メソッドを使って、リソース ID をログに出す部分が追加になっている。


□ IncludeLayout01Activity.java
---
package jp.marunomaruno.android.includelayout;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ToggleButton;
import jp.marunomaruno.android.includelayout.R;

public class IncludeLayout01Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void onClick(View view) {
        ToggleButton button = (ToggleButton) view;
        if (button.isChecked()) {
            button.setWidth(button.getWidth() * 2);
            button.setHeight(button.getHeight() * 2);

        } else {
            button.setWidth(button.getWidth() / 2);
            button.setHeight(button.getHeight() / 2);

        }

        System.out.printf("parent id = %x, id = %x", ((View) view.getParent())
                .getId(), view.getId());    // (1)
        System.out.println();
    }
}
---

(1) クリックしたビューと、その親ビューのリソース ID を表示

オブジェクトの特定のために、自身のリソース ID と、親のビュー(include 要素につけ
られた ID)のリソース ID をログに出力する。
R クラスの表現とあわせるために、16 進表記している。

    System.out.printf("parent id = %x, id = %x", ((View) view.getParent())
            .getId(), view.getId());    // (1)


View クラスのメソッド
---
int               getId()      リソース ID を取得する
final ViewParent  getParent()  親ビューを取得する
---


□ ViewParent インターフェース

親ビューになる可能性のあるビューのインターフェース。
次のビューのクラスがこのインターフェースを実装している。
    AbsListView
    AbsSpinner
    AbsoluteLayout
    AdapterView<T?extends?Adapter>
    AdapterViewAnimator
    AdapterViewFlipper
    AppWidgetHostView
    CalendarView
    DatePicker
    DialerFilter
    ExpandableListView
    FragmentBreadCrumbs
    FrameLayout
    Gallery
    GestureOverlayView
    GridLayout
    GridView
    HorizontalScrollView
    ImageSwitcher
    LinearLayout
    ListView
    MediaController
    NumberPicker
    RadioGroup
    RelativeLayout
    ScrollView
    SearchView
    SlidingDrawer
    Spinner
    StackView
    TabHost
    TabWidget
    TableLayout
    TableRow
    TextSwitcher
    TimePicker
    TwoLineListItem
    ViewAnimator
    ViewFlipper
    ViewGroup
    ViewSwitcher
    WebView
    ZoomControls

ViewParent インターフェースには、getId() メソッドがないので、これを使ってリソー
ス ID を取得するためには、View にキャストして使う必要がある。


                                                                            以上