如何使用布局来扩充一个视图

时间:2010-02-25 16:47:51

标签: android android-layout layout-inflater android-inflate

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

但他们都没有做好。

15 个答案:

答案 0 :(得分:369)

我不确定我是否已按照您的问题进行操作 - 您是否尝试将子视图附加到RelativeLayout?如果是这样,你想要做的事情是:

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

答案 1 :(得分:101)

您夸大了XML资源。请参阅LayoutInflater doc

如果您的布局位于 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);

答案 2 :(得分:25)

虽然回答很晚, 但是想补充一点来获得这个

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

其中item是您要添加子布局的父布局。

答案 3 :(得分:18)

添加到此有用,即使它是一个旧帖子,如果要将从xml中膨胀的子视图添加到视图组布局,则需要使用什么类型的视图组的线索调用inflate它将被添加到。像:

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

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

答案 4 :(得分:9)

更简单的方法是使用

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

答案 5 :(得分:6)

如果您不在活动中,可以使用from()类中的静态LayoutInflater方法获取LayoutInflater,或者从上下文方法{{1}请求服务也是:

getSystemService()

(我知道它差不多4年前,但仍然值得一提)

答案 6 :(得分:4)

答案 7 :(得分:3)

如果您想多次添加单个视图,则必须使用

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

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

答案 8 :(得分:3)

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

希望此解决方案对您有用。

答案 9 :(得分: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();

答案 10 :(得分:2)

如果要尝试将子视图附加到RelativeLayout?您可以按照以下步骤

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

答案 11 :(得分:1)

使用Kotlin,您可以使用:

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

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

答案 12 :(得分:1)

尝试此代码:

  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.

答案 13 :(得分:-1)

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

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

答案 14 :(得分:-1)

不需要任何简单的复杂性

 setContentView(R.layout.your_layout);