我目前有以下代码,从 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
函数带到另一个函数,只是像我对其他函数一样传递这个字母,这样就不会重复了吗?
答案 0 :(得分:4)
我不知道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
。
由kcoppock编辑:
例如:
int[] icons = {
R.drawable.a,
R.drawable.b,
//etc.
};
int[] sounds = {
R.raw.a,
R.raw.b,
//etc.
}
并使用icons[index]
和sounds[index]
来映射您的值。
答案 1 :(得分:1)
最简单的解决方案:向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(视图视图)方法。您可以使用它来查找该视图的开始/停止按钮并对它们执行任何操作。此外,还有一个有用的(通常是滥用的)方法对:setTag(Object object)和getTag()。您可能希望使用这些来存储单击按钮时要播放的原始音频文件的资源ID。