Як надути один вид з макетом


221

У мене макет визначений у XML. Він також містить:

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

Я хотів би надути цей відносний вигляд іншим файлом макета XML. Я можу використовувати різні макети в залежності від ситуації. Як мені це зробити? Я пробував різні варіанти

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

Але жоден з них не працював чудово.

Відповіді:


390

Я не впевнений, що я стежив за вашим запитанням - чи намагаєтесь ви додати уявлення про дітей до RelativeLayout? Якщо так, ви хочете зробити щось відповідно до:

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

3
Я отримую помилку: 02-25 22: 21: 19.324: ПОМИЛКА / AndroidRuntime (865): Викликано: java.lang.IllegalStateException: У вказаної дитини вже є батько. Спершу потрібно зателефонувати на RemoveView () батьків.
Міхал Дімель

27
Просто спробував це зараз, мені потрібно: Переглянути довідку = getLayoutInflater (). Надути (R.layout.child, null);
Джеймс

3
Проблема не в коді. Дотримуватися коду досить просто. Де ви робите файл xml це тип ресурсу стилю теми? проблема, на яку я думаю, що люди, яких я включив, - де ми розміщуємо цей XML-файл
Lpc_dark

15
Це не ідеально. Треба використовувати 3-парамову версію надувного повітря - ось чому: doubleencore.com/2013/05/layout-inflation-as-intended
Нік Кардосо

3
Відповідь невірна, навіть якщо вона працює. Будь ласка , перевірте це повідомлення possiblemobile.com/2013/05/layout-inflation-as-intended
ARK

107

Ви надуваєте ресурс 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);

4
У мене основний погляд завищений. Проблема в тому, що я хочу надути частину її з іншого XML-файлу. Цей елемент RelativeLayout є частиною більшого макета, і я хочу заповнити його макетом з іншого XML-файлу.
Міхал Дімель

гул Мені шкода, тоді я не маю поняття :(. Ви використовуєте щось основне як <include> у своєму головному
огляді,

Ні, це проста компонування. Я думаю, що я просто додаватиму свої елементи програмно - без XML. Дякуємо за допомогу!
Міхал Дімель

27

Хоча запізніла відповідь, але хотілося б додати, що це один із способів отримати це

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

де itemє батьківський макет, куди ви хочете додати дочірній макет.


(навіть пізніше все ще) У мене виникають труднощі з реалізацією вашої відповіді. Я спробував код, який ви згадали вище, але замінив "item" на: "R.layout.activity_layout" Я отримую "Немає застосовного методу до '(int, int)" "Чи можу я заважати вам за ваші думки?
Кайл

1
@Kyle - ще пізніше. Ви не можете використовувати Rресурси як посилання на об'єкт, вони просто ints. Вам потрібно скористатись findViewByIdпередачею Rресурсу, а потім набрати його на потрібний об’єкт. Потім ви можете використовувати його у функціональних викликах, як inflate. (тобто ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... тоді ви можете використовувати, itemяк вище.)
Сутенер Тризкіт

Я думаю, що я можу використовувати RelativeLayoutзамість ViewGroupцього у своєму прикладі вище, як ви не можете створити екземпляр базового класу ViewGroup. 5 хвилин мене змінило правило редагування. lol
Pimp Trizkit

Чи можливо приховати батьківський і відображати лише дитячий перегляд
NovusMobile

Дякую, цей метод допоміг, де я не міг використати getContext () у попередньому прикладі, оскільки я використовую фрагменти.
RightHandedMonkey

19

Корисно додати до цього, навіть якщо це стара публікація, що якщо дитячий погляд, який надувається з xml, повинен бути доданий до макета групи перегляду, вам потрібно зателефонувати надути з підказкою того, який тип групи перегляду він збирається до якого слід додати. Подібно до:

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

Метод надуття досить перевантажений і описує цю частину використання в документах. У мене виникла проблема, коли одне подання, надуте з XML, не було вирівнювати належним чином у батьківській програмі, поки я не змінив цей тип змін.


Нарешті, дякую :) Це дозволяє додати декілька поглядів для одного батька, але без необхідності турбуватися про LayoutParams - які читаються з XML. Хороша робота!
Сабо

13

Ще простіший спосіб - це використовувати

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

Використання не View.inflate()є найкращим способом, ніякого непотрібного LayoutInflaterабо getSystemService(Context.LAYOUT_INFLATER_SERVICE)або який - або з усіх цих незручностей! : D
varun

8

інфляція макетів

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

6

Якщо ви не займаєтесь діями, ви можете використовувати статичний 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 роки тому, але все ж варто згадати)


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

тоді він викине виключення з усіх готових доданих подань.


4

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

Сподіваюся, що це рішення працює для вас.!


3

Спробуйте цей код:

  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.


2

Мені було найважче з цією помилкою через мої унікальні обставини, але нарешті знайшли рішення.

Моя ситуація: я використовую окремий вигляд (XML), який містить "a" 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();

2

Якщо ви намагаєтесь додати відношення дитини до RelativeLayout? ви можете зробити, дотримуючись

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

1

З Котліном ви можете використовувати:

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

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

-1

Я використовував для цього фрагмент коду нижче, і він працював на мене.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.