2013-12-15 3 views
2

Я пытаюсь создать собственное представление (которое расширяет RelativeLayout), которое обертывает множество других представлений. Я хотел бы создать эти дочерние представления в файле макета xml. Теперь мне интересно, как я мог раздуть этот макет и использовать его в своем пользовательском представлении. Нечто подобное было бы здорово (внутри моего пользовательского вида):Пользовательский вид: как установить корневой макет

RelativeLayout rootLayout = (RelativeLayout) inflater.inflate(my xml file) 
this.setContenView(rootLayout); 

Unfortunatelly это возможно только в деятельности. Есть что-то подобное для просмотров?

EDIT: Я не хочу использовать View.addView (rootLayout), потому что это добавляет еще один вид иерархии, который не нужен.

ответ

2

Вы можете попробовать использовать <merge> тег в качестве корня элемент в вашем макете и раздуйте его в своем обычном RelativeLayout с помощью this как родительский, а attachToRoot - true. Тогда вам не нужно звонить addView.

Вот аналогичный пример с LinearLayout (внизу страницы), должен работать с RelativeLayout too.

0

В вашей точки зрения вы можете получить макет Inflater из контекста, надуть детей и добавить их в this (подкласс RelativeLayout)

final LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
final View child = inflater.inflate(R.layout.custom_layout, this, false); 
// Then add child to this (subclass of RelativeLayout) 
this.addView(child); 

Edit:

Код выше показывает, как надуть дети внутри пользовательского представления. This link показывает, как вставить собственное представление в XML-макет.

1

Используйте ниже

View v =getLayoutInflater().inflate(R.layout.mylayout,null); 
// inflate mylayout.xml with other views 
CustomRelativeLayout cs = new CustomRelativeLayout(this); 
// CustomRelativeLayout is a class that extends RelativeLayout 
cs.addView(v); // add the view to relative layout 
setContentView(cs); // set the custom relative layout to activity 

Пример:

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

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="111dp" 
     android:text="TextView" /> 

</RelativeLayout> 

SView

public class SView extends RelativeLayout { 

    Paint p,paint; 
    public SView(Context context) { 
     super(context); 
     TextView tv = new TextView(context); 
     tv.setText("hello"); 
     this.addView(tv); 
    } 
} 

В MainActivtiy

View v =getLayoutInflater().inflate(R.layout.mylayout,null); 
SView cs = new SView(this); 
cs.addView(v); 
setContentView(cs); 

Привязать

enter image description here

Edit:

Если вы хотите, чтобы раздуть в CustomRelative макете

В конструкторе

LayoutInflater inflater = LayoutInflater.from(context); 
View v =inflater.inflate(R.layout.mylayout,null); 
TextView tv = new TextView(context); 
tv.setText("hello"); 
this.addView(tv); 
this.addView(v); 
+0

Таким образом, я получу дополнительный уровень вложенности, который не понадобился бы - у меня будет относительный Layout (cs) и некоторый дополнительный корневой макет (mylayout), который будет вложен. Один из них бесполезен. – stoefln

+0

@stoefln, так что я, возможно, неправильно понял ваш вопрос, может быть более ясным или опубликовать некоторые фрагменты кода, указывающие, что вы сделали до сих пор. Один из них бесполезен.на самом деле вы можете динамически создавать текстовое представление и добавлять их к настраиваемому относительному расположению, в этом случае вам не нужен mylayout – Raghunandan

+0

@stoefln 'CustomRelativeLayout cs = new CustomRelativeLayout (this);' теперь вы можете создавать текстовые изображения, такие как TextView tv = new TextView (это); tv.setText ("hello"); 'Теперь добавьте textview в относительный формат, например' cs.addView (tv); '. Нет необходимости в mylayout – Raghunandan

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