0

这是我的第一个合适的应用程序,它工作得很好,但只是想知道谁能缩短我的代码并减少重复性?这是我的代码,它用于音板:

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
4

5 回答 5

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 设为一个字段,在不需要时将其释放。原因既是为了消除加载时间,也是为了减少使用的内存。

于 2013-09-21T17:20:27.043 回答
1

您不需要为每个按钮都设置一个明确的点击监听器。让 Activity 实现监听器并在 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
    }
}

这应该有助于开始。

于 2013-09-21T16:33:43.847 回答
0

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

于 2013-09-21T16:29:20.460 回答
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]
}
于 2013-09-21T16:39:19.510 回答
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();
    }
}

顺便说一句,对于 11 个按钮,您是否考虑过使用 ListView ?

于 2013-09-21T16:40:08.640 回答