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

В настоящее время у меня есть следующий код, который начинается от 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.