238

我有一个用 XML 定义的布局。它还包含:

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

我想用其他 XML 布局文件来扩充这个 RelativeView。我可能会根据情况使用不同的布局。我该怎么做?我正在尝试不同的变体

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

但它们都没有正常工作。

4

14 回答 14

416

我不确定我是否遵循了您的问题-您是否尝试将子视图附加到 RelativeLayout?如果是这样,您想按照以下方式做一些事情:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
于 2010-02-25T17:18:27.943 回答
111

您扩充了 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);
于 2010-02-25T16:54:31.873 回答
28

虽然回答迟了,但想添加一种方法来获得这个

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

item您要在其中添加子布局的父布局在哪里。

于 2011-05-04T16:15:27.927 回答
20

添加到此很有帮助,即使它是一个旧帖子,如果将从 xml 膨胀的子视图添加到视图组布局中,您需要调用 inflate 并知道它是什么类型的视图组要添加到。像:

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

inflate 方法非常重载,并在文档中描述了这部分用法。我遇到了一个问题,即从 xml 膨胀的单个视图在进行此类更改之前没有正确对齐父视图。

于 2010-06-01T22:59:13.213 回答
13

更简单的方法是使用

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
于 2015-09-02T02:43:05.003 回答
9

试试这个代码:

  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.

于 2018-12-31T06:20:58.623 回答
8

布局膨胀

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
于 2016-04-11T07:59:12.980 回答
6

如果您不在活动中,您可以使用类中的静态from()方法LayoutInflater来获取 a 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 年前,但仍然值得一提)

于 2014-02-06T22:04:07.800 回答
5

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

希望这个解决方案对你有用。!

于 2018-07-18T12:21:05.390 回答
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);
        }

然后它将抛出所有准备好的添加视图的异常。

于 2015-02-25T05:44:00.330 回答
3

如果您想将子视图附加到RelativeLayout?您可以按照以下方式进行

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);
于 2018-06-28T09:27:06.137 回答
2

由于我的特殊情况,我遇到了这个错误最困难的时候,但最终找到了解决方案。

我的情况:我正在使用一个单独的视图(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();
于 2016-04-21T03:37:55.773 回答
1

使用 Kotlin,您可以使用:

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

[your_main_layout].apply {
    //..
    addView(content)
}
于 2018-04-26T18:06:58.893 回答
-1

我为此使用了下面的代码片段,它对我有用。

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
于 2016-11-23T11:37:26.833 回答