如何膨胀一个视图与布局

我有一个用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(...)

但没有一个运行良好。

451294 次浏览

您膨胀一个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);

我不确定我是否跟上了你的问题-你是否试图将子视图附加到RelativeLayout?如果是这样,你想做的事情如下:

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

这是很有帮助的,尽管这是一篇旧文章,如果从xml中被膨胀的子视图要被添加到视图组布局中,你需要调用inflation,并提示它将被添加到哪种类型的视图组中。如:

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

膨胀方法是非常重载的,并在文档中描述了这部分用法。我有一个问题,从xml膨胀的单一视图没有正确对齐在父,直到我做了这种类型的改变。

虽然回答晚了, 但是想要添加一种方法来得到这个

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

其中item是父布局,你想在其中添加一个子布局。

如果你不在活动中,你可以从LayoutInflater类中使用静态from()方法来获取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);
}

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

更简单的方法是使用

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

由于我的特殊情况,我在这个错误上经历了最艰难的一段时间,但最终找到了解决方案。

我的情况:我正在使用一个单独的视图(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();

我使用了下面的代码片段,它为我工作。

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

使用Kotlin,您可以使用:

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


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

如果你试图将子视图附加到RelativeLayout?你可以照着做

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

attachtorroot设置为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);

希望这个方法对你有用。

试试下面的代码:

  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.

当在Kotlin中添加一个布局到一个Activity时,请参见以下步骤:

  1. 只在Activity中添加一个布局作为父布局

  2. new . Xml文件

  3. 给出R的值。

    val parent: LinearLayout =findViewById(R.id.stars)

    val view =
    LayoutInflater.from(applicationContext).inflate(R.layout.another, parent,false)
    

如果parent不是必须的,可以是null但是会出现警告信息

view.findViewById<ImageView>(R.id.ivTimer).setImageResource(R.drawable.t2)

任何视图必须以这种方式设置值,最后add

parent.apply {  addView(view)}