替代重复的代码行(Android / Java)

时间:2013-09-21 16:19:04

标签: java android

这是我的第一个正确的应用程序,它运行良好但只是好奇,看看我可以缩短我的代码并减少重复次数?这是我的代码,它适用于音板:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    //Tell system to use Media Volume rather than Ringer

    setVolumeControlStream(AudioManager.STREAM_MUSIC);

    // Button references

    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    Button button3 = (Button) findViewById(R.id.button3);
    Button button4 = (Button) findViewById(R.id.button4);
    Button button5 = (Button) findViewById(R.id.button5);
    Button button6 = (Button) findViewById(R.id.button6);

    Button button8 = (Button) findViewById(R.id.button8);
    Button button9 = (Button) findViewById(R.id.button9);
    Button button10 = (Button) findViewById(R.id.button10);
    Button button11 = (Button) findViewById(R.id.button11);
    Button button12 = (Button) findViewById(R.id.button12);
    Button button13 = (Button) findViewById(R.id.button13);


    // Button Sounds to be used by onClickListener

    final MediaPlayer buttonSound1 = MediaPlayer.create(MainActivity.this,
            R.raw.afternoondelight);
    final MediaPlayer buttonSound2 = MediaPlayer.create(MainActivity.this,
            R.raw.alrightythen);
    final MediaPlayer buttonSound3 = MediaPlayer.create(MainActivity.this,
            R.raw.ballsshowing);
    final MediaPlayer buttonSound4 = MediaPlayer.create(MainActivity.this,
            R.raw.blackmen);
    final MediaPlayer buttonSound5 = MediaPlayer.create(MainActivity.this,
            R.raw.doh);
    final MediaPlayer buttonSound6 = MediaPlayer.create(MainActivity.this,
            R.raw.fxxk);
    final MediaPlayer buttonSound8 = MediaPlayer.create(MainActivity.this,
            R.raw.mclovin);
    final MediaPlayer buttonSound9 = MediaPlayer.create(MainActivity.this,
            R.raw.pacmandeath);
    final MediaPlayer buttonSound10 = MediaPlayer.create(MainActivity.this,
            R.raw.quickwhite);
    final MediaPlayer buttonSound11 = MediaPlayer.create(MainActivity.this,
            R.raw.sexylady);
    final MediaPlayer buttonSound12 = MediaPlayer.create(MainActivity.this,
            R.raw.troll);
    final MediaPlayer buttonSound13 = MediaPlayer.create(MainActivity.this,
            R.raw.turd);

    //onClickListeners, button7 and button14 have been removed due to explicit content.

    button1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            buttonSound1.start();

        }
    });
    button2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound2.start();

        }
    });
    button3.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            buttonSound3.start();

        }
    });
    button4.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound4.start();

        }
    });
    button5.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound5.start();

        }
    });
    button6.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound6.start();
        }
    });
    //Where button7 was
    button8.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound8.start();
        }
    });
    button9.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound9.start();
        }
    });
    button10.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound10.start();
        }
    });
    button11.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound11.start();
        }
    });
    button12.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound12.start();
        }
    });
    button13.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            buttonSound13.start();

        }
    });
    //Where button14 was

5 个答案:

答案 0 :(得分:2)

有很多方法可以缩短代码。以下是其中一些:

  • 由于每个按钮的ID都设置为“button#”,因此您可以使用以下内容覆盖所有按钮的循环:
int resId = getResources().getIdentifier("button" + i, "id", getPackageName());
Button b=findViewById(resId);

然后,您可以通过每个上面的函数设置onClickListener,每次获取正确的资源来播放当前按钮,例如使用开头的常量数组:

private static final int[] SOUNDS=new
int[]{R.raw.afternoondelight,R.raw.alrightythen,... };
  • 而不是上述方法的数组,您可以设置xml中每个按钮的标记,以指向正确的声音。

  • 而不是查找视图,你可以(仅适用于按钮)在XML中设置onClick方法,所以你需要做的就是检查函数中按下了哪些按钮,然后你就可以了选择要发出的声音。

  • 另一种方法是创建一个自定义视图,该视图具有播放声音的属性,这将允许您在XMl中执行所有操作。

  • 使用第三方库,例如RoboGuiceAndroid Query

顺便说一句,既然你有这么多按钮,你介意告诉我们他们的位置和其他属性吗?也许你也可以在创建它们时做一些优化,而不是在xml文件中有这么多项......也许你可以把它们放在gridView或listView中,并避免创建这么多......

另外,请考虑将mediaPlayer设为单个字段,以便在不需要时释放。原因是为了消除加载时间和减少使用的内存。

答案 1 :(得分:1)

每个按钮都不需要显式的单击侦听器。让Actitvity实现监听器并处理onClick中的点击。此外,将MediaPlayer作为字段,因为不必创建14个单独的引用。

public class MainActivity extends Activity implements View.OnClickListener {

    MediaPlayer sound;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        //Tell system to use Media Volume rather than Ringer

        setVolumeControlStream(AudioManager.STREAM_MUSIC);

        // Button references

        Button button1 = (Button) findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.button2);
        Button button3 = (Button) findViewById(R.id.button3);
        Button button4 = (Button) findViewById(R.id.button4);
        Button button5 = (Button) findViewById(R.id.button5);
        Button button6 = (Button) findViewById(R.id.button6);

        Button button8 = (Button) findViewById(R.id.button8);
        Button button9 = (Button) findViewById(R.id.button9);
        Button button10 = (Button) findViewById(R.id.button10);
        Button button11 = (Button) findViewById(R.id.button11);
        Button button12 = (Button) findViewById(R.id.button12);
        Button button13 = (Button) findViewById(R.id.button13);

        // assign the click listener to the button

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        // etc
}

    @Override
    public void onClick(View v) {
        switch(v.getId())
        case R.id.button1:
            sound = MediaPlayer.create(MainActivity.this,
                    R.raw.afternoondelight);
            sound.start();
            break;

        case R.id.button2:
            sound = MediaPlayer.create(MainActivity.this,
                    R.raw.alrightythen);
            sound.start();
            break;

        // and so on
    }
}

这应该有助于一个开始。

答案 2 :(得分:0)

对于初学者,您应该只将一个MediaPlayer初始化为类的属性,然后单击设置要播放的资源并实际播放它。您可以创建单个onClickListener,并通过单击按钮选择声音文件。希望有所帮助

答案 3 :(得分:0)

由于你根本不熟悉编程,我希望你学习groovy;) 您的代码可以像Groovy一样缩短:

def effects = ["afternoondelight", "alrightythen", "ballsshowing", "blackmen", "doh", "fxxk", "mclovin", "pacmandeath", "quickwhite", "sexylady", "troll", "turd"] 

effects.size().times {
 Button button = (Button) findViewById(R.id."button${it}");
 MediaPlayer buttonSound = MediaPlayer.create(MainActivity.this, R.raw."${effects[it]}");
 button.onClickListener = [onClick: { View v -> buttonSound.start() } as View.OnClickListener]
}

答案 4 :(得分:0)

你的代码结构合理。但你是对的,像这样复制是邪恶的。这种方法既丑陋又容易出错(当他们变得更无聊,包括开发者时,人们会犯更多错误。)

因此,您可以/应该采取一些措施来缩减代码:

  • 使用roboguice或butterknife来查看findViewById语句。使用RoboGuice,您可以声明像

    这样的字段
    @InjectView( R.id.button1 )
    private Button button1
    

不是更好,但仍然只是必不可少的,仅此而已。

  • 一种不同的方法,我只使用MediaPlayers(但可以使用按钮)将系列放在工厂方法中。

    MediaPlayer buttonSound1 = createPlayerForResource( R.raw.afternoondelight );
    
  • 然后你可以使用最后一个技巧,我将用它与侦听器一起绑定,但你也可以用于按钮和数组:将系列放入数据结构(数组,列表,地图)等等。)

    Map<Button, Integer> mapButtonToMediaPlayerResourceId = new HashMap<Button, Integer>();
    //then init the map
    mapButtonToMediaPlayerResourceId.put( button1, R.raw.afternoondelight);
    //and so on
    

然后您可以对所有按钮使用相同的侦听器:

private class OnClickListenerPlaySoundForbutton {
    @Override
    public void onClick(View v) {
        createPlayerForResource( mapButtonToMediaPlayerResourceId.get( (Button) v ) ).start();
    }
}

BTW,对于11个按钮,你考虑过使用ListView吗?

相关问题