有没有办法使用变量更改参考路径?

时间:2013-09-12 15:10:51

标签: android variables for-loop textview

有没有办法使用变量更改Android清单中ID的引用?

如:

for(int counter6=1;counter6 <= 12; counter6++)
                value = bundle.getString("value"+counter6);
                TextView text1 = (TextView) findViewById(R.id.textView+counter6);
                text1.setText(value);

是否可以在ID目录中使用counter6变量,因此for循环可以遍历所有不同的文本视图,分别使每个text1为text1,然后将其文本设置为字符串值?

如果它不能以这种方式工作它不是一个问题,它只是意味着要编写更多的代码行。

2 个答案:

答案 0 :(得分:0)

你不能真正对id进行循环并在生成时增加它,但你可以创建一个引用数组,并通过让该数组找到每个TextView并更新文本:

<array name="array_text_views">
       <item>@id/text_view_1</item>
       <item>@id/text_view_2</item>
       <item>@id/text_view_3</item>
<array>

在你的代码中,类似的东西:

ArrayList<TextView> myTextViews = new ArrayList<TextView>();
TypedArray ar = context.getResources().obtainTypedArray(R.array.array_text_views);
int len = ar.length();
for (int i = 0; i < len; i++){
    myTextViews.add(findById(ar[i]));
} 
ar.recycle(); 

答案 1 :(得分:0)

我通常只会在代码中放置一个小的int[] Ids数组。如果您有很多,请考虑以编程方式创建它们(layout.addView(new TextView(..)。

例如,如果您想要启动Activity并告诉它通过Extras Bundle显示哪些字符串,您可以直接将它们作为数组放置。

void startOther(String[] texts) {
    Intent i = new Intent( /* ... */);
    i.putExtra("texts", texts);
    // start via intent
}

现在在Activity里面,我会将ids视为“常数”。

// hardcoded array of R.ids
private static final int[] TEXT_IDS = {
    R.id.text1,
    R.id.text2,
    // ...
};

然后同时使用Bundle和id Array,例如:

// a List of TextViews used within this Activity instance
private List<TextView> mTextViews = new ArrayList<TextView>(TEXT_IDS.length);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.something);

    // find all TextViews & add them to the List
    for (int id : TEXT_IDS) {
        mTextViews.add((TextView)findViewById(id));
    }

    // set their values based on Bundle
    String[] stringArray = savedInstanceState.getStringArray("texts");
    for (int i = 0; i < mTextViews.size() && i < stringArray.length; i++) {
        mTextViews.get(i).setText(stringArray[i]);
    }
}