这是我的第一个正确的应用程序,它运行良好但只是好奇,看看我可以缩短我的代码并减少重复次数?这是我的代码,它适用于音板:
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
答案 0 :(得分:2)
有很多方法可以缩短代码。以下是其中一些:
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中执行所有操作。
使用第三方库,例如RoboGuice或Android Query。
另外,请考虑将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吗?