0

我目前有以下代码,从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函数带到不同的函数中,然后像我对其他函数所做的那样传递字母,这样就不会重复了?

4

2 回答 2

4

我不知道RR.drawable是什么;什么是R.drawable.apple,R.drawable.ball等?假设它们都具有相同的类型,您可能希望将 R.drawable 设为一个数组,其中索引为“A”的索引为 0,“B”的索引为 1,等等,并将其初始化为 R.drawable[0] = (无论“苹果”应该是什么),R.drawable[1] =(“球”也是如此);然后使用类似的东西

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

同样对于R.raw. 那么你根本不需要 a switch

由 kcoppock 编辑:

例如:

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

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

并使用icons[index]sounds[index]映射您的价值观。

于 2013-08-23T21:36:28.403 回答
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(View view) 方法。您可以使用它来找到该视图的开始/停止按钮并对它们执行任何操作。此外,还有一个有用(并且经常被滥用)的方法对:setTag(Object object) 和 getTag()。您可能希望研究使用它们来存储单击按钮时要播放的原始音频文件的资源 ID。

于 2013-08-23T21:25:12.280 回答