通过消除额外的代码使应用程序更有效

时间:2013-08-23 21:20:40

标签: java android

我目前有以下代码,从 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 个答案:

答案 0 :(得分:4)

我不知道RR.drawable是什么;什么是R.drawable.appleR.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。