Android: на объект макета с целым числом в ID нельзя ссылаться - PullRequest
3 голосов
/ 25 октября 2011

Я пытаюсь программно установить изображения некоторых кнопок ImageButton в моем макете.Для этого я назвал свои ImageButtons от ic_1 до ic_5.

Во время моего метода инициализации я хочу просмотреть эти 5 кнопок ImageButton и установить их изображения в соответствии со списком возможных значков.По сути, пользователи могут изменять порядок отображения значков, что, в свою очередь, приводит к изменению изображения на кнопках ImageButtons.

Однако я не могу ссылаться на кнопки, поскольку у них целое число в их идентификаторе,Код, который я использую для этого, выглядит следующим образом:

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. Когда я просто использую "ic_1" в butid, оно также возвращает 0. Однакоесли я даю ImageButton идентификатор как ic_one, он работает.Но если я собираюсь использовать чистые текстовые идентификаторы, я не смогу перебирать кнопки ImageButtons.

Сначала я подумал, что это означает, что идентификатор Werent правильно переведен в файл R.java, нов нем присутствуют кнопки с их соответствующими идентификаторами, как показано ниже.

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

Кто-нибудь знает, если серьезно не возможно использовать int в идентификаторе объекта макета, и если да, если это возможноперебирать кнопки ImageButtons так, как я хочу, без целого числа в идентификаторе?Простой пример будет оценен.


Еще немного информации для Уоррена:

Спецификация макета:

@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 ]

2 голосов
/ 25 октября 2011

Возможно, это не совсем то, что вы пытались сделать, но если вы имеете дело только с 5 кнопками, вы всегда можете просто объявить статический массив идентификаторов кнопок и пройти через них.

Что-токак:

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 голосов
/ 25 октября 2011

вы начинаете с 0, вот в чем проблема.

начать цикл с i =1 ;

1 голос
/ 25 октября 2011

Вы начинаете свой цикл с i = 0, но ваш ic_1 начинается с 1. Измените цикл, чтобы начать с 1, что должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...