Intereting Posts

Как получить доступ к представлениям внутри макета при повторном использовании его несколько раз?

Я ознакомился с трюком Android UI 2 у разработчиков 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"/> 

И я включаю его три раза в другой файл макета. У меня есть три TextViews с идентификатором firstText и еще три с secondText? Разве нет столкновения с идентификатором? И как мне найти второй Text TextView в третьем включенном макете с findViewById? Что мне следует вводить в методе findViewById?

Solutions Collecting From Web of "Как получить доступ к представлениям внутри макета при повторном использовании его несколько раз?"

Предположим, вы хотите включить это:

 <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 для сужения поиска только для своих детей.

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

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