2010-10-28 3 views
33

Я хочу разложить свой интерфейс на несколько XML-макетов. Первый из них будет основным макетом, а другие - макетами контента.Android: Как динамически включать 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" /> 

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

Спасибо!

ответ

36
<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)); 
+0

Я попытался использовать addView в другом случае, но это выглядело как макет, где накладывались друг на друга. Второй ребенок означает на втором уровне, так что под моим RelativeLayout право? Могу ли я использовать ссылки как android: layout_belowe = "@ + id/title" в моем макете контента, если они не определены в одном файле XML? Если нет, то как они предполагают знать, как вставить его в нужное место? Спасибо – nbarraille

+0

Было бы добавлено, где вы положили воздаяние (// Я ХОЧУ ВКЛЮЧАТЬ МОЕ СОДЕРЖАНИЕ ЗДЕСЬ ????). Для сложных макетов вы всегда можете прокручивать дочерние элементы представления (групп) через getChildCount(), getChildAt() и добавлять представление, где хотите. Кроме того, вы можете установить id через view.setId() в коде, а затем обратиться к этому. Но, конечно, это будет константа в коде, а не через R.id.someId, поскольку идентификатор, назначенный через java-код, не находится в вашем R-файле. –

+1

Хорошо, я понял, индекс 1 (второй ребенок) на самом деле означает, что он будет вставлен между заголовком и кнопкой, 0 было бы до названия и т. Д. Спасибо. – nbarraille

5

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

This answer discusses using one ViewStub.

+1

Да, вот как я это делаю обычно, но, по-видимому, ViewStubs, как предполагается, будет использоваться для элементов, которые вы не используете часто. – nbarraille

+0

Если вы изменяете только два разных типа представлений списков, вы можете просто изменить адаптер, с которым связано представление списка, программным образом (и, следовательно, использовать разные XML-элементы элемента списка). –

+0

К сожалению, у меня есть несколько макетов контента, и некоторые из них более сложны. – nbarraille

Смежные вопросы