Вопрос

У меня есть макет, определенный в XML.Он также содержит:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

Я хотел бы раздуть этот RelativeView с помощью другого файла макета XML.В зависимости от ситуации могу использовать разные раскладки.Как я должен это делать?Я пробовал разные варианты

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

Но ни один из них не работал нормально.

Это было полезно?

Решение

Я не уверен, что уловил ваш вопрос: вы пытаетесь прикрепить дочернее представление к RelativeLayout?Если это так, вы хотите сделать что-то вроде:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

Другие советы

Вы раздуваете XML-ресурс.См. Документ LayoutInflater .

Если ваш макет находится в мойlayout.xml, вы бы сделали что-то вроде:

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

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

Хотя поздний ответ, но хотел бы добавить этот один способ получить это

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

где item — родительский макет, в который вы хотите добавить дочерний макет.

К этому полезно добавить, несмотря на то, что это старый пост, что если дочернее представление, которое раздувается из xml, должно быть добавлено в макет группы представлений, вам нужно вызвать inflate с подсказкой о том, какой тип группы представлений он будет использовать. быть добавленным.Нравиться:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

Метод inflate довольно перегружен и описывает эту часть использования в документации.У меня возникла проблема: одно представление, раздутое из xml, не выравнивалось должным образом в родительском элементе, пока я не внес такое изменение.

Еще более простой способ - использовать

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

инфляция макета

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);

Если вы не участвуете в активности, вы можете использовать статический from() метод из LayoutInflater класс, чтобы получить LayoutInflater, или запросите услугу из контекстного метода getSystemService() слишком :

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(Я знаю, что это было почти 4 года назад, но все же стоит упомянуть)

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

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

Если тебе нравится

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

и

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

тогда он выдаст исключение для всех готовых добавленных представлений.

Для AttachToRoot установлено значение True.

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

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

На этой кнопке нажмите «Событие». Мы можем установить следующий код для увеличения макета в этом действии.

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

Надеюсь, это решение подойдет вам.!

Из-за моих уникальных обстоятельств мне было труднее всего справиться с этой ошибкой, но, наконец, я нашел решение.

Моя ситуация:Я использую отдельное представление (XML), которое содержит WebView, затем открывается в AlertDialog когда я нажимаю кнопку в главном представлении активности.Но так или иначе WebView принадлежал основному представлению активности (вероятно, потому, что я беру ресурс отсюда), поэтому прямо перед тем, как я назначил его своему AlertDialog (с точки зрения), мне нужно было получить родителя моего WebView, поместите его в ViewGroup, а затем удалите все просмотры по этому поводу ViewGroup.Это сработало, и моя ошибка исчезла.

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

....позже, после того как я загрузил свой WebView ....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

Если вы пытаетесь прикрепить дочернее представление к RelativeLayout?вы можете сделать, следуя

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

Попробуйте этот код:

  1. Если вы просто хотите раздуть свой макет:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. Если вы хотите раздуть свой макет в контейнере (родительский макет):

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.

С Kotlin вы можете использовать:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

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

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);

Не нужно никаких сложностей, это просто, как

 setContentView(R.layout.your_layout);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top