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

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

Ответ 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);