Как раздуть один вид с помощью макета
у меня есть макет, определенный в 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 ответов:
Я не уверен, что я следил за вашим вопросом-вы пытаетесь прикрепить дочернее представление к 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);
надеюсь, что это решение работает для вас.!