Layout inflater — только для части макета в другом макете

#android #android-layout

#Android #android-layout

Вопрос:

В моем приложении у меня есть макет list_item.xml с 3 текстовыми представлениями, которые заполняются из массива, и я хочу раздуть только эти 3 текстовых представления в другом макете. Макет, в котором я хочу выполнить раздувание, представляет собой отдельный XML-файл layout_result.xml который имеет единственную кнопку и виджет поиска для Android.

файл макета для list_item.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="25px"
    android:minHeight="25px"
    android:background="#F0F8FF"
    android:orientation="horizontal" 
    android:layout_weight="1">


    <TextView
        android:id="@ id/ID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@ id/ProductName"
        android:layout_alignBottom="@ id/ProductName"
        android:layout_alignParentLeft="true"
        android:text="New Text" />

    <TextView
        android:id="@ id/Status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="17dp"
        android:layout_marginTop="42dp"
        android:text="New Text" />

    <TextView
        android:id="@ id/Name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@ id/Status"
        android:layout_alignBottom="@ id/Status"
        android:layout_centerHorizontal="true"
        android:text="New Text" />


</RelativeLayout>
  

Макет для list_resut.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="25px"
    android:minHeight="25px"
    android:background="#F0F8FF"
    android:orientation="horizontal" 
    android:layout_weight="1">

    <SearchView
        android:id="@ id/searchView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="118dp"
        android:layout_marginTop="16dp" >
    </SearchView>

    <Button
        android:id="@ id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignTop="@ id/searchView1"
        android:layout_marginLeft="22dp"
        android:text="Button" />

</RelativeLayout>
  

Проблема, с которой я столкнулся, когда попытался включить виджет поиска и кнопку внутри list_item.xml и раздувание их заключалось в том, что виджет поиска и кнопка вставлялись в каждый из 3 элементов textview.

Итак, я создал этот отдельный макет list_result.xml который содержит только виджет поиска и кнопку.

Вопрос, есть ли вообще место, где я могу разместить это list_item.xml с результатами textview внутри list_result.xml чтобы исправить эту ошибку?

Мое средство раздувания макета для list_item выглядит следующим образом,

  public View getView(int i, View view, ViewGroup viewGroup) {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View itemView = inflater.inflate(R.layout.list_item, viewGroup, false);

            TextView txtName = (TextView) itemView.findViewById(R.id.Name);
            TextView txtID= (TextView) itemView.findViewById(R.id.ID);
            TextView txtStatus = (TextView) itemView.findViewById(R.id.Status);

            txtName.setText(list.get(i).getProductName());
            txtID.setText(list.get(i).getProductID());
            txtStatus.setText(list.get(i).getStatus());
            return itemView;
       }
    }
  

Комментарии:

1. включение не приводит к раздуванию. кстати, я прочитал три раза и не понял проблему. Не могли бы вы немного перефразировать?

2. Привет, blackbelt, теперь я перефразировал свою проблему. Надеюсь, это понятно!

3. Я тоже прочитал несколько раз и полностью запутался. Однако то, что вы, возможно, пытаетесь сделать, это использовать ваш list_resut.xml в качестве макета в setContentView() для вашего Activity и добавить к нему ListView . Затем вы раздуваете свой TextView макет в getView() , как вы делаете сейчас.

4. Привет, codeMagic, да, я пробовал это раньше, но я всегда получал сообщение об ошибке «Просмотр не найден для id». Итак, я спросил, есть ли какой-либо другой способ сделать это.

Ответ №1:

Вы должны быть в состоянии просто создать один макет XML. Не уверен, как вы делали это ранее, но вы могли бы сделать что-то вроде этого:

 <RelativeLayout>
    <RelativeLayout>
        <TextView/>
        <TextView/>
        <TextView/>
    </RelativeLayout/>
    <SearchView/>
    <Button/>
 </RelativeView>
  

Если вы хотите сохранить XML отдельно, а затем объединить их во время выполнения, вам все равно нужен «контейнер» для увеличенных текстовых представлений. Вы могли бы использовать FrameLayout в качестве контейнера. Что-то вроде этого, например:

results.xml:

 <RelativeLayout>
    <FrameLayout/>
    <SearchView/>
    <Button/>
</RelativeLayout>
  

items.xml

 <RelativeLayout>
    <TextView/>
    <TextView/>
    <TextView/>
</RelativeView/>
  

И затем вы можете вставить текстовые представления в другой макет следующим образом:

 ViewGroup container = (ViewGroup) findViewById(R.id.FrameLayoutId);
container.addChild(yourInflaterItemsView);
  

Надеюсь, это поможет