Android: как динамически включить макет XML? - PullRequest
35 голосов
/ 28 октября 2010

Я хочу разбить свой пользовательский интерфейс на несколько XML-макетов. Первым будет основной макет, а другим - макеты контента.

Я хотел бы иметь возможность установить, какой content_layout должен динамически включаться во время выполнения, поэтому я не хочу устанавливать "layout="@+layout/content_layout" в моем XML-файле.

Вот мои макеты:

main_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="600dp"
    android:layout_height="800dp" >

    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true" />

    <include /> <!-- I WANT TO INCLUDE MY CONTENT HERE -->

    <Button
        android:id="@+id/cancelButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Cancel" />

</RelativeLayout>

content_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/whatever"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />

content_layout2.xml:

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/whatever2"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />

Как я могу это сделать?

Спасибо!

Ответы [ 2 ]

38 голосов
/ 29 октября 2010
<RelativeLayout android:id="@+id/rl" ...

В вашем коде:

// get your outer relative layout
RelativeLayout rl = (RelativeLayout) findById(R.id.rl);


// inflate content layout and add it to the relative layout as second child
// add as second child, therefore pass index 1 (0,1,...)

LayoutInflater layoutInflater = (LayoutInflater) 
        this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
rl.addView(1, layoutInflater.inflate(R.layout.content_layout, this, false) ); 
5 голосов
/ 29 октября 2010

Вы можете попробовать использовать ViewStub и просто изменить макет, который он будет раздувать программно.

В этом ответе рассматривается использование одного ViewStub.

...