Android:无法引用ID为整数的布局对象

时间:2011-10-25 13:48:30

标签: android xml layout integer

我正在尝试以编程方式在我的布局中设置一些ImageButtons的图像。 为此,我将我的ImageButtons ic_1命名为ic_5。

在我的初始化方法中,我想循环浏览这5个ImageButton并根据可能的图标列表设置它们的图像。 基本上用户可以更改图标的显示顺序,这反过来会改变ImageButtons上的图像。

但是,我似乎无法引用按钮,因为它们的ID中有一个Integer。 我用于此的代码是这样的:

for (int i = 1; i < 2; i++) {

                    String butid = "ic_"+i;
                    int resID = getResources().getIdentifier(butid, "id",
                            getPackageName());
                    ImageButton button = (ImageButton) findViewById(resID);

然而,这会返回NullPointerException,因为resID返回0.当我在butid中使用“ic_1”时,它也返回0。 但是,如果我将一个ID作为ic_one提供给ImageButton,它确实有效。但是,如果我要使用纯文本ID,我将无法遍历ImageButtons。

首先我认为这意味着ID没有正确地翻译成R.java文件,但按钮存在于其中,其各自的ID如下所示。

    public static final int ic_1=0x7f05000e;
    public static final int ic_2=0x7f05000f;

有没有人知道在布局对象的ID中是否真的不可能使用int,如果是这样,是否可以像我想要的那样遍历ImageButtons而不需要ID中的整数?一个简单的例子将不胜感激。


Warren的更多信息:

布局规范:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainscreen);
    setMenuImage();
    initMainScreen();
}

应更改图标的完整代码:

public void initMainScreen() {
    if (standard == false) {
        retrieveLinks();
        int size = mso.getHome().getIcon().size();

        if (size > 0) {
            for (int i = 1; i < 2; i++) {

                String butid = "ic_"+i;
                int resID = getResources().getIdentifier(butid, "id",
                        getPackageName());

                String buttype = mso.getHome().getIcon().get(i)
                        .getIconName();
                System.out.println(buttype.toLowerCase());
                int typeID = getResources().getIdentifier(buttype.toLowerCase(),
                        "drawable", getPackageName());

                ImageButton button = (ImageButton) findViewById(resID);
                if(button != null){
                button.setImageResource(typeID);
                }else{
                    System.out.println(butid+" "+resID);
                }
            }
        }
    }
}

布局文件中的规范:(所有按钮都相同)

    <ImageButton android:layout_height="wrap_content"
        android:layout_weight="33" android:layout_width="wrap_content"
        android:src="@drawable/empty_icon" android:onClick="iconClick" android:background="@null" android:id="@+id/ic_1"></ImageButton>

3 个答案:

答案 0 :(得分:2)

你从0开始,这就是问题所在。

i =1 ;

开始循环

答案 1 :(得分:2)

它可能不是你想要做的,但如果你只处理5个按钮,你总是可以声明一个Button Id的静态数组并循环它们。

类似的东西:

private static final int[] buttons =
     {R.id.ic_1, R.id.ic_2, R.id.ic_3, R.id.ic_4, R.id.ic_5};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainscreen);
    setMenuImage();
    initMainScreen();
}

public void initMainScreen() {
    if (standard == false) {
        retrieveLinks();
        int size = mso.getHome().getIcon().size();

        if (size > 0) {
            for (int i = 1; i < 2; i++) {

                String buttype = mso.getHome().getIcon().get(i)
                        .getIconName();
                System.out.println(buttype.toLowerCase());
                int typeID = getResources().getIdentifier(
                        buttype.toLowerCase(), "drawable", getPackageName());

                //Using the array of button id's directly
                ImageButton button = (ImageButton) findViewById(buttons[i]);
                if(button != null){
                button.setImageResource(typeID);
                }else{
                    System.out.println(butid+" "+resID);
                }
            }
        }
    }
}

答案 2 :(得分:1)

您使用i = 0开始循环,但ic_11开头。将循环更改为以1开头,这应该可以解决问题。