(Android Studio) Как я могу сделать все изображения интерактивными без повторяющихся строк кода?

#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;
    }
}