以编程方式在for循环中获取视图ID?

5

我想知道是否有一种方法可以使用for循环创建id。

我的xml中有10个按钮,它们的id是button1,button2,button3......button10。现在我在java类中创建了一个Button数组,并按如下方式进行操作:

public class Menu extends Activity
{
    Button[] arrayButton=new Button[10];

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

        init();
    }

    private void init()
    {
        for(int i=1 ; i<9 ; i++)
        {
            String abc = "but"+String.valueof(i);
            int x = Integer.parseInt(abc);


            Log.d("abc", abc);

            Log.d("x", String.valueOf(x) );

            //arrayButton[i] = (Button) findViewById(R.id.x);  // giving error 

            //arrayButton[i].setText("Hello:");
        }
    }

}

我想知道如何使用 for 循环获取所有按钮,以便加快我的工作速度,并且有时候我想设置所有按钮的文本。

4个回答

3

使用 getResources().getIdentifier 方法,像这样:

String abc = "but"+String.valueof(i);
int resID = getResources().getIdentifier(abc, "id", getPackageName());
arrayButton[i] = (Button) findViewById(resID );
arrayButton[i].setText("Hello:");

即,将init()方法简单重写为:
private void init()
    {
        for(int i=1 ; i<9 ; i++)
        {
            String abc = "but"+String.valueof(i);
            int resID = getResources().getIdentifier(abc, "id", getPackageName());
            arrayButton[i] = (Button) findViewById(resID);
            arrayButton[i].setText("Hello:");
        }
    }

或者简单说,您可以使用。
    int[] buttonIDs = new int[] {R.id.but1, R.id.but2, R.id.but3,R.id.but4, ... }
    for(int i=0; i<buttonIDs.length; i++) {
        Button b = (Button) findViewById(buttonIDs[i]);
        b.setText("Hello:" + b.getText().toString());
}

现在,如果我想像这样打开活动,我该怎么做呢?我的意思是在for循环中使用startActivity("Activity"+i)。这是否可行? - Zar E Ahmer
@Nepster 但是你一次只能开始一个活动,请描述具体情况。 - Giru Bhai

2
如果您已经知道所有的id,您可以简单地使用以下方法:
int [] ids = new int [] {R.id.btn1, R.id.btn2, ...};
Button [] arrayButton = new Button[ids.length];

for(int i=0 ; i < arrayButton.length ; i++)
{
  arrayButton[i] = (Button) findViewById(ids[i]);
}

如果你不知道它们,可以使用:

getResources().getIdentifier("btn1","id",getPackageName())

+1 现在如果我想像这样打开活动,我该怎么做呢?我的意思是在一个for循环中使用startActivity("Activity"+i)..这种方式可行吗? - Zar E Ahmer
1
同样的方式:Class [] classes = new Class [] {Activity1.class, Activity2.class, ...}; - Simon Marquis
getResources().getClasses("btn1", "id", getPackageName())... 像这样的任何其他方法... - Zar E Ahmer
不可以使用这个。它只能用于资源标识符。 - Simon Marquis
任何其他方式,例如获取类或获取包名下的类 - Zar E Ahmer

2
尝试这种方法,希望能帮助您解决问题。
主要文件:main.xm
    <LinearLayout
        android:id="@+id/lnrMain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/button10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

MainActvity.java

public class MainActivity extends Activity {

    private LinearLayout lnrMain;
    private Button[] arrayButton;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lnrMain = (LinearLayout) findViewById(R.id.lnrMain);
        arrayButton=new Button[10];
        init();
    }

    private void init()
    {
        for(int i=0;i<lnrMain.getChildCount() ; i++)
        {
            arrayButton[i] = (Button) lnrMain.getChildAt(i);
            arrayButton[i].setText("Hello:"+(i+1));
        }
    }

}

0
你可以创建一个辅助 void,例如:
public static int getResourceID(Context mContext, String StrId) {
    return mContext.getResources().getIdentifier(StrId, "id", mContext.getPackageName());
}

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