web-dev-qa-db-ja.com

レイアウトを複数回再利用する場合、レイアウト内のビューにアクセスするにはどうすればよいですか?

Android UIトリック2 Android開発者向けに読んだことがあります。これは、別のレイアウトファイルにレイアウトを複数回含める方法を説明し、これらに含まれるレイアウトを提供します。異なるID。ただし、ここでのサンプルは、このレイアウトのビューのIDではなく、レイアウトIDを上書きしています。たとえば、workspace_screen.xmlが次のようになっている場合:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical">
<TextView Android:id="@+id/firstText"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="first"/>
<TextView Android:id="@+id/secondText"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="second"/>

そして、それを別のレイアウトファイルに3回含めます。 IDがfirstTextのTextViewが3つ、secondTextのTextViewが3つになるのでしょうか。 IDの衝突はありませんか?そして、findViewByIdを使用して3番目に含まれるレイアウトでsecondText TextViewを見つけるにはどうすればよいですか? findViewByIdメソッドに何を入力する必要がありますか?

32
user412759

これを含めたいとしましょう:

<LinearLayout
    Android:layout_height="wrap_content"
    Android:layout_width="fill_parent"
    Android:orientation="horizontal"
>
    <ImageView
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content"
        Android:src="@drawable/some_image"
    />
    <TextView
        Android:id="@+id/included_text_view"
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content"
    />
</LinearLayout>

したがって、コードに次のように挿入します。

<LinearLayout
    Android:layout_height="wrap_content"
    Android:layout_width="fill_parent"
    Android:orientation="vertical"
>
    <include Android:id="@+id/header_1" layout="@layout/name_of_layout_xml" />
    <include Android:id="@+id/header_2" layout="@layout/name_of_layout_xml" />
</LinearLayout>

ここで、含まれているレイアウト内のテキストビューにアクセスして、テキストを動的に設定します。コードに次のように入力するだけです。

LinearLayout ll = (LinearLayout)findViewById(R.id.header_1);
TextView tv = (TextView)ll.findViewById(R.id.included_text_view);
tv.setText("Header Text 1");

ll = (LinearLayout)findViewById(R.id.header_2);
tv = (TextView)ll.findViewById(R.id.included_text_view);
tv.setText("Header Text 2");

個々のLinearLayoutsのfindViewByIdメソッドを使用して、検索を子のみに絞り込むことに注意してください。

66
d370urn3ur

TableRowレイアウトを作成し、それをforループのコードで再利用したいと思いました。私は問題を探していて、ついに解決策を見つけました。

        TableLayout table = (TableLayout) findViewById(R.id.listTable);
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ImageButton[] button = new ImageButton[4];
        TableRow[] row = new TableRow[4];

        for(int i =0 ; i<4;i++){

                row[i] = (TableRow) inflater.inflate(R.layout.list_row, null);
                table.addView(row[i]);
                button[i] = (ImageButton)row[i].findViewById(R.id.editBtn);
                button[i].setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Log.i(TAG,"Button Clicked");
                    }
                });

このようにして、レイアウトを再利用する機能を実現し、内部要素にアクセスすることもできます。

3
ValayPatel