2011年9月2日金曜日

LayoutInflaterについて勉強する その2

LayoutInflaterについて勉強する その2

Activityが取り扱えるレイアウトはsetContentView()で設定します。この設定によるレイアウト以外のレイアウトを取り扱いたい場合にLayoutInflaterを使います。
LayoutInflaterは、プロジェクト内の任意のXMLファイルの内容(View)を、動的に取り扱えるようにするクラスです。
このクラスにより生成されたViewの在り方について実験しました。結論は次のとおりです。

  1. getLayoutInflater()を何度実行しても、返されるLayoutInflaterオブジェクトは同一のものである。
  2. LayoutInflaterのinflate()が返すViewオブジェクトは、inflate()の実行毎に異なる。このことから、inflate()は、その内部でViewをnewしていると想定される。

この結論を得るために使ったsourceを掲載しておきます。
public class LayoutInflaterActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        
        LayoutInflater inf1, inf2;
        TextView tv1, tv2, tv3, tv4;
        
        setContentView(R.layout.main);
        
        inf1 = getLayoutInflater();
        tv1 = (TextView)inf1.inflate(R.layout.textview, null);
        tv1.setText("inf1a");
        
        tv2 = (TextView)inf1.inflate(R.layout.textview, null);
        tv2.setText("inf1b");
        
        inf2 = getLayoutInflater();
        tv3 = (TextView)inf2.inflate(R.layout.textview, null);
        tv3.setText("inf2a");
        
        tv4 = (TextView)inf2.inflate(R.layout.textview, null);
        tv4.setText("inf2b");
        
        Log.d("Inf", "tv1:" + tv1.getText());
        Log.d("Inf", "tv2:" + tv2.getText());
        Log.d("Inf", "tv3:" + tv3.getText());
        Log.d("Inf", "tv4:" + tv4.getText());
        if(inf1==inf2){
            Log.d("Inf", "Inf1==Inf2");
        }
        else{
            Log.d("Inf", "Inf1!=Inf2");
        }
        if(tv1==tv2){
            Log.d("Inf", "tv1==tv2");
        }
        else{
            Log.d("Inf", "tv1!=tv2");
        }
        if(tv1==tv3){
            Log.d("Inf", "tv1==tv3");
        }
        else{
            Log.d("Inf", "tv1!=tv3");
        }
    }
}

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"
    >
</LinearLayout>

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

ログの出力は次のとおりです。
09-02 01:09:47.375: DEBUG/Inf(960): tv1:inf1a
09-02 01:09:47.375: DEBUG/Inf(960): tv2:inf1b
09-02 01:09:47.385: DEBUG/Inf(960): tv3:inf2a
09-02 01:09:47.385: DEBUG/Inf(960): tv4:inf2b
09-02 01:09:47.385: DEBUG/Inf(960): Inf1==Inf2
09-02 01:09:47.385: DEBUG/Inf(960): tv1!=tv2
09-02 01:09:47.385: DEBUG/Inf(960): tv1!=tv3

0 件のコメント:

コメントを投稿