#android #switch-statement
#Android #инструкция switch
Вопрос:
Как вы можете видеть на двух изображениях, я пытаюсь добавить кучу открываемых плиток, с которыми пользователь может играть. Чтобы сделать эти изображения доступными для просмотра, я решил использовать инструкцию switch из этого приложения-калькулятора. Есть ли способ превратить инструкцию switch, которая связана с этими фрагментами, в цикл или функцию, вместо этого ужасно длинного фрагмента кода? Возможно, что-то вроде этого?
onTapped(arg0.getId, [R.id.tile1, R.id.tile2, R.id.tile3, R.id.tile4, R.id.tile5, R.id.tile6, R.id.tile7], ['l','e','a','s','t')
onTapped(id, listOfTiles, listOfLetters){
int i = 0;
for each tile:
if (!tile1_flag) {
str = str.append(listOfLetters[i ]);
disp.setText(str);
tile1.setColorFilter(Color.argb(150, 200, 200, 200));
tile1_flag = true;
break;
Вот оригинальная функция.
boolean tile1_flag = false;
boolean tile2_flag = false;
boolean tile3_flag = false;
boolean tile4_flag = false;
boolean tile5_flag = false;
boolean tile6_flag = false;
boolean tile7_flag = false;
.
.
.
public void onClick(View arg0) {
TextView disp = (TextView) findViewById(R.id.tileOutput);
Editable str = (Editable) disp.getText();
switch (arg0.getId()) {
case R.id.tile1:
if (!tile1_flag) {
str = str.append('l');
disp.setText(str);
tile1.setColorFilter(Color.argb(150, 200, 200, 200));
tile1_flag = true;
break;
} else {
break;
}
case R.id.tile2:
if (!tile2_flag) {
str = str.append('e');
disp.setText(str);
tile2.setColorFilter(Color.argb(150, 200, 200, 200));
tile2_flag = true;
break;
} else {
break;
}
case R.id.tile3:
if (!tile3_flag) {
str = str.append('a');
disp.setText(str);
tile3.setColorFilter(Color.argb(150, 200, 200, 200));
tile3_flag = true;
break;
} else {
break;
}
case R.id.tile5:
if (!tile5_flag) {
str = str.append('s');
disp.setText(str);
tile4.setColorFilter(Color.argb(150, 200, 200, 200));
tile4_flag = true;
break;
} else {
break;
}
case R.id.tile6:
if (!tile6_flag) {
str = str.append('t');
disp.setText(str);
tile4.setColorFilter(Color.argb(150, 200, 200, 200));
tile4_flag = true;
break;
} else {
break;
}
Комментарии:
1. Посмотрите на повторяющийся код. Выясните, что отличается, а что такое же. Поместите код в функцию и сделайте части, которые являются одинаковыми, телом функции. Затем передайте части, которые изменяются, и используйте функцию
2. Единственный способ сделать это — создать изображения в коде и добавить их в массив, таким образом, вы сможете создать свой цикл
3. циклы — это оптимизированный способ со списком объектов
Ответ №1:
Вы можете создать внутренний класс со всеми свойствами изображения, например, так
class ImageProperties {
public boolean titleFlag;
public String appendLetter;
...
ImageProperties(boolean titleFlag, String appendLetter, ...) {
this.titleFlag = titleFlag;
...
}
}
а затем заполнить их, добавив в качестве тега к вашему соответствующему изображению, например
ImageView title1 = (ImageView) findViewById(R.id.title1);
title1.setTag(new ImageProperties(false, "l"))
и, наконец, получить их в
public void onClick(View arg0) {
ImageView imageView = (ImageView) arg0;
ImageProperties imageProperties = (ImageProperties) arg0.getTag();
if (!imageProperties.titleFlag) {
str = str.append(imageProperties.appendLetter);
disp.setText(str);
imageView.setColorFilter(Color.argb(150, 200, 200, 200));
imageProperties.titleFlag = true;
}
}