Как мне получить доступ к представлениям внутри макета, когда я использую его несколько раз? - PullRequest
31 голосов
/ 06 августа 2010

Я прочитал трюк 2 пользовательского интерфейса Android для разработчиков Android, в котором рассказывается, как многократно включать макет в другой файл макета, и назначать этим включенным макетам другой идентификатор.Однако образец здесь перезаписывает идентификатор макета, а не идентификатор представлений в этом макете.Например, если файл 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"/>

И я включаю его три раза в другой файл макета.Я получаю три TextView с идентификатором firstText и еще три с secondText?Нет ли столкновения идентификаторов?И как мне найти второй текстовый текстовый вид в третьем включенном макете с помощью findViewById?Что я должен ввести в методе findViewById?

Ответы [ 2 ]

66 голосов
/ 17 декабря 2010

Скажите, что вы хотите включить это:

<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");

обратите внимание, что вы используете отдельные методы findViewById LinearLayouts, чтобы сузить поиск только до их дочерних элементов.

3 голосов
/ 16 апреля 2012

Я хотел создать макет 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");
                    }
                });

Таким образом, вы можете достичь функциональности повторного использования макета, а также получить доступ к внутренним элементам

...