Android-动态地将视图添加到视图中

我有一个视图布局-

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="0px"
android:orientation="vertical">


<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/items_header"
style="@style/Home.ListHeader" />


<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/items_none"
android:visibility="gone"
style="@style/TextBlock"
android:paddingLeft="6px" />


<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/items_list" />




</LinearLayout>

我想做的是,在我的主要活动与布局这样

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="0px"
android:id="@+id/item_wrapper">
</LinearLayout>

我想循环通过我的数据模型,并注入多个视图组成的第一个布局到主布局。我知道我可以通过在代码中完全构建控件来实现这一点,但是我想知道是否有一种方法可以动态构建视图,这样我就可以继续使用布局,而不是将所有内容都放在代码中。

289761 次浏览

使用 LayoutInflater根据布局模板创建视图,然后将其注入到需要它的视图中。

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);


// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");


// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

您可能必须调整要插入视图的索引位置。

另外,根据您希望 LayoutParams 如何适应父视图来设置 LayoutParams。例如 FILL_PARENTMATCH_PARENT等。

参见 LayoutInflater类。

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup parent = (ViewGroup)findViewById(R.id.where_you_want_to_insert);
inflater.inflate(R.layout.the_child_view, parent);

它看起来就像您真正想要的带有自定义适配器的 ListView 来充满指定的布局。使用 数组适配器和方法 notifyDataSetChanged(),您可以完全控制视图的生成和呈现。

看看这些教程

为了让@Mark Fisher 的回答更清楚,被膨胀的插入视图应该是布局文件夹下的 xml 文件,但是里面没有布局(ViewGroup) ,比如 LinearLayout 等。我的例子:

Res/layp/my _ view. xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/i_am_id"
android:text="my name"
android:textSize="17sp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>

然后,插入点应该是一个类似 LinearLayout 的布局:

Res/layp/activity _ main. xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/aaa"
android:layout_width="match_parent"
android:layout_height="match_parent">


<LinearLayout
android:id="@+id/insert_point"
android:layout_width="match_parent"
android:layout_height="match_parent">


</LinearLayout>


</RelativeLayout>

那么密码应该是

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shopping_cart);


LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.my_view, null);
ViewGroup main = (ViewGroup) findViewById(R.id.insert_point);
main.addView(view, 0);
}

我发布这个非常相似的答案的原因是,当我试图实现 Mark 的解决方案时,我被困在了哪个 xml 文件应该用于 insert _ point 和子视图的问题上。我首先在子视图中使用了布局,它完全不起作用,我花了几个小时才弄明白。所以希望我的探索能节省别人的时间。

// Parent layout
LinearLayout parentLayout = (LinearLayout)findViewById(R.id.layout);


// Layout inflater
LayoutInflater layoutInflater = getLayoutInflater();
View view;


for (int i = 1; i < 101; i++){
// Add the text layout to the parent layout
view = layoutInflater.inflate(R.layout.text_layout, parentLayout, false);


// In order to get the view we have to use the new view with text_layout in it
TextView textView = (TextView)view.findViewById(R.id.text);
textView.setText("Row " + i);


// Add the text view to the parent layout
parentLayout.addView(textView);
}