Как раздуть одно представление с помощью макета
-
22-09-2019 - |
Вопрос
У меня есть макет, определенный в 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);
Попробуйте этот код:
- Если вы просто хотите раздуть свой макет:
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);
- Если вы хотите раздуть свой макет в контейнере (родительский макет):
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);