Сделайте приложение более эффективным, исключив лишние коды

В настоящее время у меня есть следующий код, который начинается от A до Z:

if (someId.matches("A") || someId.matches("a")) { tvLetCap.setText("A"); tvLetLow.setText("a"); ivLetterIcon.setImageResource(R.drawable.apple); btnDisplayWord.setText("A is for APPLE"); btnPlay.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { stopPlaying(); mpSound = MediaPlayer.create(MyClass.this, R.raw.a); mpSound.setLooping(false); mpSound.start(); btnPlay.setVisibility(View.GONE); btnStop.setVisibility(View.VISIBLE); btnStop.setOnClickListener(stopSound); mpSound.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { btnPlay.setVisibility(View.VISIBLE); btnStop.setVisibility(View.GONE); } }); } });
}
if (someId.matches("B") || someId.matches("b")) { tvLetCap.setText("B"); tvLetLow.setText("b"); ivLetterIcon.setImageResource(R.drawable.ball); btnDisplayWord.setText("B is for BALL"); btnPlay.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { stopPlaying(); mpSound = MediaPlayer.create(MyClass.this, R.raw.b); mpSound.setLooping(false); mpSound.start(); btnPlay.setVisibility(View.GONE); btnStop.setVisibility(View.VISIBLE); btnStop.setOnClickListener(stopSound); mpSound.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { btnPlay.setVisibility(View.VISIBLE); btnStop.setVisibility(View.GONE); } }); } });
}

Будет ли это работать против этого:

switch(someId) { case A: setLetter("A"); addIcon("apple"); break; case B: setLetter("B"); addIcon("ball"); break; default: break;
}
public void setLetter(String strLetter) { tvLetCap.setText(strLetter); tvLetLow.setText(strLetter.toLowerCase());
}
public void addIcon(String iconLetter) { ivLetterIcon.setImageResource(R.drawable. + iconLetter); btnDisplayWord.setText(iconLetter.charAt(0).toUpperCase() + " is for " + iconLetter.toUpperCase());
}

Я предполагаю, что единственная проблема может быть в этой строке и как я ее исправлю?:

ivLetterIcon.setImageResource(R.drawable. + iconLetter);

Также будет возможно взять всю функцию btnPlay на другую функцию и просто передать букву, как я сделал с другими функциями, чтобы она не повторялась?

2 ответа

Простейшее решение: добавьте еще один параметр в addIcon:

public void addIcon(String iconLetter, int iconResource){ ivLetterIcon.setImageResource(iconResource); btnDisplayWord.setText(iconLetter.charAt(0).toUpperCase() + " is for " + iconLetter.toUpperCase());
}

Затем назовите его

setIcon("apple", R.drawable.apple);

Что касается повторного использования прослушивателя кликов, это, безусловно, возможно. У вас может быть один прослушиватель onClick, который прослушивает все представления. При щелчке по представлению он передается как аргумент метода onClick (View view). Вы можете использовать это, чтобы найти кнопку старт/стоп для этого вида и делать с ними что угодно. Кроме того, существует полезная (и часто злоупотребляемая) пара методов: setTag (объект Object) и getTag(). Возможно, вам захочется изучить их, чтобы сохранить идентификатор ресурса для необработанного аудиофайла, который вы хотите воспроизвести при нажатии кнопки.


Я не знаю, что такое R и R.drawable; и что такое R.drawable.apple, R.drawable.ball и т.д.? Предполагая, что все они имеют один и тот же тип, вы можете захотеть сделать R.drawable массив, где индекс равен 0 для "A", 1 для "B" и т.д., И инициализировать его так, чтобы R.drawable [0] = ( независимо от того, что "яблоко" должно быть), R.drawable [1] = (то же самое для "шара"); затем используйте что-то вроде

R.drawable[someId.charAt(0).toUpperCase() - 'A']

и аналогичным образом для R.raw. Тогда вам не понадобится switch.

EDIT by kcoppock:

Например:

int[] icons = { R.drawable.a, R.drawable.b, //etc.
};
int[] sounds = { R.raw.a, R.raw.b, //etc.
}

и используйте icons[index] и sounds[index] чтобы сопоставить ваши значения.

licensed under cc by-sa 3.0 with attribution.