Как раздуть один вид с помощью макета


у меня есть макет, определенный в 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(...)

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

14 198

14 ответов:

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

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

вы раздуваете XML-ресурс. Смотрите LayoutInflater doc .

Если ваш макет в mylayout.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, должно быть добавлено в макет viewgroup, вам нужно вызвать inflate с подсказкой о том, к какому типу viewgroup он будет добавлен. Например:

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);

если ты не в деятельности, вы можете использовать статический!--1--> метод 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 года назад, но все же стоит упомянуть)

, проверьте эту ссылку. Он имеет ответ -> https://possiblemobile.com/2013/05/layout-inflation-as-intended/

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

   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);
        }

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

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

моя ситуация: я использую отдельный вид (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();

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

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

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

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

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

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);

надеюсь, что это решение работает для вас.!

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

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