0

我正在制作一个文字游戏,其中每个用户都有多个猜测,每个猜测由多个 TextViews 组成。到目前为止,我的代码如下:

TextView[] guess1 = new TextView[numTextViews];
guess1[0] = (TextView) findViewById(R.id.Guess1_1);
guess1[1] = (TextView) findViewById(R.id.Guess1_2);
guess1[2] = (TextView) findViewById(R.id.Guess1_3);
guess1[3] = (TextView) findViewById(R.id.Guess1_4);
guess1[4] = (TextView) findViewById(R.id.Guess1_5);

xml看起来像:

<TextView
    android:id="@+id/Guess1_1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:gravity="center"
    android:text="@string/guessChar" />...

android:id=随着变化而重复。

如果我输入它TextView[] guess2及其所有元素,我将重复自己。

  • 有什么更好的方法来解决这个问题?
  • 以编程方式创建所有 TextView 会更好吗,因为它们非常相似?
4

3 回答 3

3

这是您可以在不重复代码中使用 id 的情况下迭代视图的方法:

LinearLayout ll = (LinearLayout) findViewById(R.id.layout_containing_textviews);
for (int i = 0; i < ll.getChildCount(); i++) {
    if (ll.getChildAt(i).getClass() == TextView.class) {
         guess1[i] = (TextView)ll.getChildAt(i);
    }
}

TextView如果您有非视图,请确保对此进行调整,因为i在这种情况下索引将不连续。您可以为TextViews 使用另一个计数器。

现在如果你的布局只有TextViews,你甚至不需要一个数组。您可以将该布局用作容器/数组,就像上面截图中使用的那样。

于 2013-05-03T07:06:18.383 回答
0

你知道每个文本视图的猜测次数是多少吗?

我建议你使用反射

Class clazz = R.id.class; // get the R class
Field f = clazz.getField("Guess1_" + "1");
int id = f.getInt(null);  // pass in null, since field is a static field.
TextView currcell = (TextView) findViewById(id); 

在这种情况下,它将带来 Guess1_1

对于你的情况:

 for (int i =0; i < numTextViews; i++)
 {
     Class clazz = R.id.class;
     Field f = clazz.getField("Guess1_" + Integer.toString(i+1));
     int id = f.getInt(null);
     guess[i] = (TextView)findViewById(id);
 }

但这只会为您带来第一个 Guess1 数组,您需要将其转换为通用代码..所以可能会出现一些问题..所以用你现在拥有的 xml 阅读它是最简单的方法..

编辑:

如果所有 textView 具有相同的属性,您也可以通过编程方式创建它

LinearLayout view = new LinearLayout(this); // create new linear layout
view.setOrientation(LinearLayout.HORIZONTAL); // optional.. so the 
                                              // view will be horizontaly

view.setLayoutParams(new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                         LinearLayout.LayoutParams.WRAP_CONTENT)); // set the layout           
                                                                   // height and width

 for (int i = 0; i < numOf ; i ++)                                      
 {                       
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
               LinearLayout.LayoutParams.WRAP_CONTENT, 
               LinearLayout.LayoutParams.WRAP_CONTENT);

     guess[i] = new TextView();
     guess[i].setLayoutParams(lp);
     guess[i].setID(i+1);
}
于 2013-05-03T07:00:44.673 回答
0

您可以以编程方式创建 textViews(如果您也希望使用一些 xml,则使用 inflate),或者您可以使用 getIdentifier 方法,例如:

private static final String ID_FORMAT="Guess1_%d";
...
for(int i=0;i<10;++i)
  {
  String id=String.format(FORMAT,i);
  TextView tv = (TextView) findViewById(getResources().getIdentifier(id, "id", getPackageName()));
  //...
  }

如果你想在一个循环中做一个循环也是如此。

如果布局有很多视图,我建议改用adapterView (listView,gridView,...),并避免创建这么多视图(以编程方式或通过xml)。

于 2013-05-03T07:58:20.443 回答