我正在尝试以编程方式在我的布局中设置一些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>
答案 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_1
以1
开头。将循环更改为以1
开头,这应该可以解决问题。