克隆TextView以将其附加到ViewGroup中

13

我在XML中定义了一个ViewGroup,里面有一个view,在onCreate时间里,我想要一个这些变量。
我不想使用listview+adapter的麻烦,因为我知道列表自onCreate()后不会改变,这显然是过度设计了。
这差不多就是我想要的代码。

TextView mytextview = myViewGroup.findViewById(R.id.mytext);

for(String test : strings){
  mytextview = mytextview.clone();
  mytextview.setText(test);
  myViewGroup.addView(mytextview);
}

但是它没有起作用。


你当前得到的结果是什么?myTextView 只显示了一次? - Mathias Conradt
我已在此处添加了答案 http://stackoverflow.com/a/15761866/884674 请查看是否适用于您。 - jeet.chanchawat
3个回答

19

可以使用 inflater,将 TextView 放在外部布局文件中:

View v = LayoutInflater.from(this).inflate(R.layout.textview_include, null);
viewGroup.addView(v);

1
如果我不能使用Inflater,我该怎么办? - suitianshi

2

使用Mathias Lin的代码并借鉴javahead76的提示:

LinearLayout x = (LinearLayout) findViewById(R.id.container); 

    for (int i = 0; i < 5; i++) {
        View c = LayoutInflater.from(this).inflate(R.layout.singlerow, x);  
        TextView t = ((TextView)findViewById(R.id.textView1));
        t.setId(i+10000);
        t.setText("text"+i);            
    }
    TextView b = (TextView) findViewById(10003);
    b.setText("10003");

1
for 循环结束时 findViewById 的目的是什么?该函数返回 ID 为 04 的视图(在您的情况下),但您没有在任何地方使用它。 - Pimp Trizkit
@ Pimp Trizkit,你说得对,我忘记删掉它了。这是旧代码。 - Khaled Annajar

1
如果您这样做,很可能每个以这种方式创建的视图都会获得完全相同的ID。这意味着执行像((TextView)v).setText("some text");这样的操作将在先前从同一布局中膨胀的每个TextView上调用。您仍然可以以这种方式执行此操作,但应调用setId()并具有某些合理的方法来确保您不连续两次获得相同的ID-增量或通用时间等。
此外,我认为Android为动态创建的ID保留了一定范围的ID。您可以避免使用此范围内的ID;但是,老实说,我不知道ID系统如何工作,因此在这一点上我可能是错误的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接