#android #unit-testing #testing #reflection #junit
#Android #модульное тестирование #тестирование #отражение #junit
Вопрос:
Предположим, у меня есть приложение, в котором есть похожие кнопки с именами button0, button1 и т. Д., Вплоть до button9.
Как я могу сделать следующее, не дублируя код?
button0 = (Button) activity.findViewById(com.sample.SampleApp.R.id.button0);
button1 = (Button) activity.findViewById(com.sample.SampleApp.R.id.button1);
...
button9 = (Button) activity.findViewById(com.sample.SampleApp.R.id.button9);
Я пытался использовать отражение, но код выглядит нечистым.
for (int i = 0; i <= 9; i ) {
String btnName = "button" i;
/* do reflection stuff to link self.buttonX
with a reference to com.sample.SampleApp.R.id.buttonX */
}
Ответ №1:
Следующий код не тестировался, но попробуйте:
Button[] buttons = new Button[]{button0, button1, button2, button3, button4, button5, button6, button7, button8, button9};
for (int i = 0; i < buttons.length, i ) {
buttons[i] = (Button) findViewById(getResources().getIdentifier("button" i, "id", "com.sample.SampleApp"));
}
С помощью ArrayList (опять же непроверенный — просто чтобы дать вам представление о том, что я имею в виду):
ArrayList<Button> buttons = new ArrayList<Button>();
for (int i = 0; i < 10, i ) {
buttons.add(new Button(this));
buttons.get(i) = (Button) findViewById(getResources().getIdentifier("button" i, "id", "com.sample.SampleApp"));
}
Комментарии:
1. Спасибо! getResources().getIdentifier() очень поможет, но есть ли способ избежать массива кнопок?
2. Я полагаю, вы могли бы немного почистить его, используя ArrayList с элементами Button, но я не думаю, что вы получите его более «чистым», чем это. Я бы хотел, чтобы мне доказали, что я ошибаюсь 🙂
3. ArrayList вообще не помог, но вы помогли мне увидеть, что мне не нужны переменные экземпляра для ссылки на элементы пользовательского интерфейса, если бы я мог создать локальную переменную для ссылки на протестированный элемент пользовательского интерфейса, найденный findViewById . Спасибо.
4. Да, теперь, когда я думаю об этом, ArrayList, вероятно, плохая идея. Я не уверен, что вы можете сделать это намного лучше, чем первое предложение.