Как раздуть один вид с помощью макета
У меня есть макет, определенный в 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(...)
Но никто из них не работал нормально.
Ответы
Ответ 1
Я не уверен, что я выполнил ваш вопрос: пытаетесь ли вы привязать детское представление к RelativeLayout? Если это так, вы хотите сделать что-то по строкам:
RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
Ответ 2
Вы раздуваете XML-ресурс. См. Документ LayoutInflater.
Если ваш макет находится в файле 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);
Ответ 3
Хотя поздний ответ,
но хотел бы добавить, что один способ получить это
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.mylayout, item );
где item - родительский макет, где вы хотите добавить дочерний макет.
Ответ 4
Полезно добавить к этому, даже если это старый пост, что если дочернее представление, которое накачивается из xml, должно быть добавлено в макет представления, вам нужно вызвать надувание с подсказкой того, какой тип группы просмотра он будет добавлен. Как:
View child = getLayoutInflater().inflate(R.layout.child, item, false);
Метод раздувания довольно перегружен и описывает эту часть использования в документах. У меня была проблема, когда одно представление, завышенное от xml, не правильно выравнивалось в родительском элементе, пока я не сделал этот тип изменений.
Ответ 5
Еще проще использовать
View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
Ответ 6
макет инфляции
View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
Ответ 7
Если вы не работаете, вы можете использовать статический метод 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 года назад, но все же стоит упомянуть)
Ответ 8
Проверьте эту ссылку. У него есть ответ → https://possiblemobile.com/2013/05/layout-inflation-as-intended/
Ответ 9
Если вы хотите добавить один просмотр несколько раз, вы должны использовать
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);
}
то он будет исключать все готовые добавленные представления.
Ответ 10
У меня было самое сложное время с этой ошибкой, из-за моих уникальных обстоятельств, но, наконец, нашли решение.
Моя ситуация: я использую отдельный вид (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 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();
Ответ 11
Я использовал ниже фрагмент кода для этого, и он работал у меня.
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);