2013-07-29 3 views
1

У меня есть несколько пользовательских LinearLayout, которые я хочу добавить динамически на главный RelativeLayout. Это одна из моих пользовательских макетов:Добавить настраиваемый макет в макет операции динамически

public class MyLayout1 extends LinearLayout {...} 

Это my_layout_1.xml файл для него:

<?xml version="1.0" encoding="utf-8"?> 
<***myPackageName***.MyLayout1 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
...... 
</***myPackageName***.MyLayout1> 

добавить пользовательский макет в RelativeLayout используя этот код:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); 
View view = getLayoutInflater().inflate(R.layout.my_layout_1, mainLayout, false); //mainLayout is the id of the main RelativeLayout 
mainLayout.addView(view, params); 

Код работает нормально.
Но когда я использую функцию findViewById(...) в своем классе MyLayout1, он возвращает null для всех видов. Как я могу связать файл .xml и класс Java? Я думал, что добавить имя пакета + класса в .xml было достаточно, но я был неправ. Также я пытался позвонить

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View view = inflater.inflate(R.layout.my_layout_1, null); 

в MyLayout1 классе, но сообщение об ошибке android.view.InflateException: Binary XML file line #2: Error inflating class <unknown> отображается в окне лога.

+0

Вы хотите найти findViewById() (0) –

+0

Как вы относитесь к коду в своем классе? Это в конструкторе? В методе, вызванном откуда-то еще? –

+0

О, да. Сожалею. Я изменю его сейчас. – smb

ответ

1

Если вам нужно позвонить findViewById(), чтобы получить доступ к экземплярам представлений, объявленных внутри вашего файла layout.xml, тогда вам нужно сделать это в View#onfinishInflate(). Это вызывается после того, как представление закончено надуванием. В этой функции вы можете успешно использовать findViewById(). Когда использование findViewById() в конструкторе при раздутии представления дочерние представления не будут создаваться и добавляться еще. Вот почему он возвращает null.

+0

Большое спасибо! – smb

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