2011年9月1日木曜日

LayoutInflaterについて勉強する

LayoutInflaterについて勉強する

この記事は、私が初心者であった時のものです。分かり易く書いたつもりの記事を、LayoutInflaterに掲載しました。(2012/05/05)

LayoutInflaterは、他のxmlリソースのViewを取扱える仕掛けです。
これについて勉強するため、コーディングしましたのでsourceを公開します。

ここに掲載したのは学習・実験を目的にしたものです。まともに動くプログラムは、動的にレイアウトの挿入&削除を繰り返すに掲載してあります。

以下 javaファイル********************
/*
 * LayoutInflaterへの理解を深めるため、ありがちなメソッドfindViewById()と、
 * LayoutInflaterを使った仕掛けとの両方を書きました。
 * LayoutInflaterはxmlファイルを扱えはしますが、そのファイルはリソースにある
 * コンパイルされたファイル(R.something file)を指します。
つまり、物理的に存在するxmlファイルを直接取り扱うのではありません。
例:res>layout>main.xml を設定するのでは無い
R.layout.main を設定します。
 */
public class LayoutInflaterActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
     
        LinearLayout ll;
        LayoutInflater inf;
        TextView tv;
/*
LayoutInflaterは、getSystemServiceメソッドから取得する。
getSystemServiceという名前から推察できるように、システムのサービスの一環として
LayoutInflaterが提供される仕掛けとなっている。
getSystemService()を使えばWifiやUSBなどハードウェア関連のサービスも使えるようになる。
たかだか、XMLファイルを扱うだけなのに、何故こんな仕掛けが必要なのでしょうか、という疑問が湧いてくる。
 */
        inf = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//こんな大げさな仕掛けには違和感を感じる。
getSystemServiceメソッドに目移りをしてしまい、このメソッドの仕掛けを勉強しなければならないような雰囲気になります。
そんな御仁にお勧めなのが次のメソッドだ。
        inf = getLayoutInflater();//初めから、これを出せ。(-_-;)
     
        //main画面をActivityで表示できるようにする。
        setContentView(R.layout.main);//毎度お馴染みのメソッドです。
        ll = (LinearLayout)findViewById(R.id.MainView);
     
        //main画面の中にあるTextViewを取得する。
        tv = (TextView)findViewById(R.id.MainText);//これも毎度お馴染み
        tv.setText("ccc");//文字列の代入に成功する。当たり前。
        //以上は、ありがちなプログラム処理です。
     
        //別のファイルにあるTextViewを取得するように試みる。
        tv = (TextView)findViewById(R.id.SubText);
        if(tv==null){
            //しかし、nullが返される。
            Log.e("InfAct", "return findViewById() : null");
            //普段よく使うfindViewById()は、自分のActivity画面にしか使えないのだ。
            return;
        }
        //上記エラーのため、以下を実行できない。
        tv.setText("ddd");//実行できない無駄なコード
        ll.addView(tv);//実行できない無駄なコード
     
        //もし、上記エラーが無いとして、ここまで来たとした場合,,,,
        //別のxmlファイルにアクセスする。
        tv = (TextView)inf.inflate(R.layout.textview, null);
        tv.setText("eee");//文字列の代入ができる。おお。すごい。
        ll.addView(tv);//main画面に挿入することだってできる。
    }
}

以上 javaファイル********************

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MainView"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView  
        android:id="@+id/MainText"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/aaa"
        />
</LinearLayout>

textview.xml
<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/SubText"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/bbb"
    >
</TextView>

string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">LayoutInflater</string>
    <string name="aaa">aaa</string>
    <string name="bbb">bbb</string>
</resources>

0 件のコメント:

コメントを投稿