运行时Android上的重复视图

时间:2013-02-10 14:38:03

标签: android view layout-inflater

我为活动创建了一个布局文件。在这个布局中,我创建了一个带有textview和edittext的LinearLayout。 现在我想创建额外的LinearLayouts,它将查看并包含与原始LinearLayout完全相同的视图,但具有不同的文本。我还想在运行期间以编程方式执行此操作,因为这些LinearLayout的数量在运行之间会有所不同。 我已经阅读了一些关于inflaters的信息,但我不太了解它们。

我在想这样的事情,显然代码是错误的,但希望你明白我想做什么:

LinearLayout llMain = (LinearLayout)findViewById(R.id.mainLayout);
LinearLayout llToCopy = (LinearLayout)findViewById(R.id.linearLayoutToCopy);
for(int player = 0; player < size; player++)
{
   LinearLayout llCopy = llToCopy.clone();
   TextView tv = (TextView)llCopy.getChildAt(0);
   tv.setText(players.get(player).getName());
   llMain.addView(llCopy);
}

2 个答案:

答案 0 :(得分:16)

有几种方法可以实现这一目标 一种快速简便的方法是在循环的每次迭代中膨胀新布局:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main, null);

for (int i = 0; i < 10; i++) {
    View child = inflater.inflate(R.layout.child, null);
    TextView tv = (TextView) child.findViewById(R.id.text);
    tv.setText("Child No. " + i);
    parent.addView(child);
}

setContentView(parent);

另一个(更优雅的)解决方案是创建一个扩展LinearLayout的单独类:

public class ChildView extends LinearLayout {

    private TextView tv;

    public ChildView(Context context) {
        super(context);

        View.inflate(context, R.layout.child, this);
        tv = (TextView) findViewById(R.id.text);
    }

    public void setText(String text) {
        tv.setText(text);
    }
}

现在,您可以在循环的每次迭代中创建ChildView,并通过setText(String text)方法设置文本:

for (int i = 0; i < 10; i++) {
    ChildView child = new ChildView( this );
    child.setText("Child No. " + i);
    parent.addView(child);
}

答案 1 :(得分:4)

您可以使用layout inflater

来实现

使用此

获取布局填充
LayoutInflater inflater = (LayoutInflater) context.getSystemService
      (Context.LAYOUT_INFLATER_SERVICE);
LinearLayout newlayout = inflater.inflate(R.layout.yourlayout, null);

// newlayout is the copy of your layout and you can use it and to get 
// the textview and edittext do it like this

TextView text = (TextView) newlayout.findView(R.id.yourtextviewid);
text.setText("new text");
EditText et = (EditText) newlayout.findView(R.id.yourtextviewid);