Как включить макет внутрь макета?


Ответы:


198

Изменить: как в комментарии, который правильно запрошен здесь, дополнительная информация. Используйте includeтег

<include
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   layout="@layout/yourlayout" />

чтобы включить макет, который вы хотите использовать повторно.

Проверьте эту ссылку ...


11
только крошечная деталь: используйте android: layout_width = "match_parent" вместо android: layout_width = "fill_parent". fill_parent устарел.
Trinity

1
Могу ли я включить макет и установить некоторые из его свойств через xml, например, установить текстовую строку во вложенном макете непосредственно в теге <include>?
JohnyTex

@JohnyTex Не уверен, что вы можете сделать это прямо в <include />теге, однако вы можете сделать это с помощью java-кода. см . ответ Phileo99 ниже, чтобы узнать, как получить ссылку на включенный макет. а затем вы можете изменить его содержимое.
Моисей

58

Обратите внимание, что если вы включите android:id...в <include />тег, он переопределит любой идентификатор, определенный внутри включенного макета. Например:

<include
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:id="@+id/some_id_if_needed"
   layout="@layout/yourlayout" />

yourlayout.xml:

<LinearLayout
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:id="@+id/some_other_id">
   <Button
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:id="@+id/button1" />
 </LinearLayout>

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

View includedLayout = findViewById(R.id.some_id_if_needed);
Button insideTheIncludedLayout = (Button)includedLayout.findViewById(R.id.button1);


6

Попробуй это

<include
            android:id="@+id/OnlineOffline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            layout="@layout/YourLayoutName" />

3

Из официальных документов о повторном использовании макетов

Хотя Android предлагает множество виджетов для предоставления небольших интерактивных элементов, которые можно использовать повторно, вам также может потребоваться повторно использовать более крупные компоненты, требующие особого макета. Чтобы эффективно повторно использовать полные макеты, вы можете использовать тег для встраивания другого макета в текущий макет.

Вот мой файл header.xml, который я могу повторно использовать с помощью тега include

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    >


    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:text="@string/app_name"
        android:textColor="#000000" />

</RelativeLayout>

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#f0f0f0" >


    <include
        android:id="@+id/header_VIEW"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        layout="@layout/header" />

        <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="#ffffff"
        android:orientation="vertical"
        android:padding="5dp" >


    </LinearLayout>

Зачем помещать TextView в RelativeLayout, а не в корневое представление?
Флориан Вальтер

@FlorianWalther Это пример
IntelliJ Amiya

Спасибо за быстрый ответ. Но прав ли я в том, что я могу поместить TextView в качестве корневого элемента, или я что-то упускаю? Потому что я хочу повторно использовать ProgressBar и задумываться, нужно ли мне помещать его в макет.
Флориан Вальтер

@FlorianWalther, Because I want to reuse a ProgressBarкакая проблема?
IntelliJ Amiya

Нет проблем, работает. Но все примеры, которые я вижу в Интернете, помещают один виджет в другой макет, и мне интересно, почему.
Флориан Вальтер

0

Узнать больше По этой ссылке https://developer.android.com/training/improving-layouts/reusing-layouts.html

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Game_logic">
    
          
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:id="@+id/text1"
                    android:textStyle="bold"
                    tools:text="Player " />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textStyle="bold"
                    android:layout_marginLeft="20dp"
    
                    android:id="@+id/text2"
                    tools:text="Player 2" />
          
            
          
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>

Цитата

  • Вышеупомянутый макет вы можете использовать в другой деятельности, используя

     <?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                      xmlns:app="http://schemas.android.com/apk/res-auto"
                      xmlns:tools="http://schemas.android.com/tools"
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      tools:context=".SinglePlayer">   
    
              <include layout="@layout/activity_game_logic"/> 
          </androidx.constraintlayout.widget.ConstraintLayout>
    
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.