infraterって何だ

レイアウトを別ファイルで定義する方法 | GE Android Blog

androidのレイアウトxml用のSSI*1的な物と理解した。
…じゃ、幾ら何でも何なんで。

無理やりユースケース


こんな漢字の郵便番号入力フォームなんてのがあったとして。

  • ユーザー登録画面のユーザーの住所入力
  • 買い物した商品の送付先住所入力
  • 請求書の送付先住所入力

の3つの画面にそれぞれこんなレイアウトを作成するのは面倒臭いので、外部に郵便番号入力用レイアウトの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="horizontal">
   
  <TextView
    android:text="default"
    android:id="@+id/zipcode" />
  <Button
    android:text="find"
    android:id="@+id/btn_findByZipcode" />
  <TextView
    android:text="default"
    android:id="@+id/address1" />
  <TextView
    android:text="default"
    android:id="@+id/address2" />
</LinearLayout>

これを使う3つの画面の方で

public class IncludeCheck extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        // ここは画面ごと代わる
        LinearLayout mainLayout = (LinearLayout)findViewById(R.id.layout_main);
         
        //LayoutInflaterの準備
        LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        
        //郵便番号入力用のパーツを読み込み 
        LinearLayout incLayout = (LinearLayout)inflater.inflate(R.layout.include, null);
        Button btn = (Button)incLayout.findViewById(R.id.btn_findByZipcode);
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                 // 郵便番号検索したり値をセットしたり。(*1)
            }
        }
        mainLayout.addView(incLayout);
    }
}

みたいな感じにするといいんじゃないかな。

もう一手間

この場合、どの画面でもbtn_findByZipcodeがやる事(*1)は同じなんで郵便番号検索する部分を分離して、Singletonなりにするとよさげ。

public class ZipCodeFinder extends OnClickListener{
    private static ZipCodeFinder __instance =null;
    public static ZipCodeFinder getInstance(){
         if (__instance==null) __instance = new ZipCodeFinder();
        return __instance ;
    }
    
    @Override
    public void onClick(View v) {
        // 郵便番号の値を読み取って該当する住所を
        //  address1 / address2 にセットするとか。
    }
}

的な感じにして、

        Button btn = (Button)incLayout.findViewById(R.id.btn_findByZipcode);
        btn.setOnClickListener(ZipCodeFinder.getInstance());

とか。

*1:server side include : http://e-words.jp/w/SSI.html