当我多次重复使用时,如何访问布局中的视图?

时间:2010-08-06 07:41:08

标签: android layout include

我已经在Android开发人员上阅读了Android UI技巧2,它告诉人们如何多次在另一个布局文件中包含布局,并为这些包含的布局赋予不同的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"/>

我在另一个布局文件中包含了三次。我最终得到三个带有id firstText的TextView,还有另外三个带有secondText的TextView?是不是有碰撞?如何在findViewById的第三个包含布局中找到secondText TextView?我应该在findViewById方法中输入什么内容?

2 个答案:

答案 0 :(得分:63)

假设您想要包含此内容:

<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方法将搜索范围缩小到只有他们的孩子。

答案 1 :(得分:3)

我想创建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");
                    }
                });

通过这种方式,您可以实现重用布局的功能,还可以访问内部元素