Java Android Studio中的循环数组
我正在尝试做一些简单的应用,比如点击按钮,播放声音。 在我的上一个应用程序中,我用开关盒完成了所有操作,但我意识到,如果我有很多代码,我必须为每个按钮和一个开关盒编写很多代码。 现在,我正试图将我的按钮和声音保存到数组中,并将它们循环成一个双循环 我还做了一些上下文菜单,效果很好。但我现在的问题是播放声音。实际上,它会播放两个按钮的声音2。它应该为按钮1->sound1和按钮2->sound2播放 有人能找到我的问题吗Java Android Studio中的循环数组,java,android,android-studio,Java,Android,Android Studio,我正在尝试做一些简单的应用,比如点击按钮,播放声音。 在我的上一个应用程序中,我用开关盒完成了所有操作,但我意识到,如果我有很多代码,我必须为每个按钮和一个开关盒编写很多代码。 现在,我正试图将我的按钮和声音保存到数组中,并将它们循环成一个双循环 我还做了一些上下文菜单,效果很好。但我现在的问题是播放声音。实际上,它会播放两个按钮的声音2。它应该为按钮1->sound1和按钮2->sound2播放 有人能找到我的问题吗 public class MainActivity extends AppC
public class MainActivity extends AppCompatActivity {
MediaPlayer MainMedia;
public int [] buttonsas = {R.id.button1, R.id.button2};
public int [] sounds = {R.raw.sound1, R.raw.sound2};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i=0; i<buttonsas.length; i++) {
Button contextMenuButton = (Button) findViewById(buttonsas[i]) ;
registerForContextMenu(contextMenuButton);
}
MainMedia = MediaPlayer.create(this, R.raw.sound1);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.item_option1:
case R.id.item_option2:
Toast.makeText(this, item.toString(), Toast.LENGTH_LONG).show();
break;
case R.id.item_option3:
Toast.makeText(this, item.toString(), Toast.LENGTH_LONG).show();
break;
}
return super.onContextItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.main_menu, menu);
}
public void MainMedia (View view) {
for (int i=0; i<buttonsas.length; i++) {
for (int j=0; j<sounds.length; j++) {
MainMedia.release();
MainMedia = MediaPlayer.create(MainActivity.this, sounds[j]);
MainMedia.start();
}
}
}
}
public类MainActivity扩展了AppCompatActivity{
媒体播放器;
public int[]buttonsas={R.id.button1,R.id.button2};
public int[]sounds={R.raw.sound1,R.raw.sound2};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
对于(int i=0;i问题出在你的循环中。你实际上是在同时启动所有声音。你想用它来实现什么?如果我正确理解你的代码,在方法MainMedia
中,它实际上是在为两个按钮播放两种声音,但它似乎只是在播放第二种声音,因为e第一个几乎立即发布
老实说,我认为有更整洁、更少处理的解决方案,但如果您想使用两个嵌套的for
解决方案,那么我认为解决方案可以是:
尝试将if
语句放在第二个for
之后,这样您就可以知道您正在按哪个按钮了:
public void MainMedia (View view) {
for (int i=0; i<buttonsas.length; i++) {
for (int j=0; j<sounds.length; j++){
if (view.getId() == buttonsas[i] && i == j) {
MainMedia.release();
MainMedia = MediaPlayer.create(MainActivity.this, sounds[j]);
MainMedia.start();
}
}
}
}
公共媒体(视图){
对于(int i=0;i您好,正如我在顶部所说的。例如,我有3个按钮和3个声音文件。我想设置button1-sound1、button2-Sound2、button3-sound3。所以为什么不创建一个方法并使用onclick listener传递声音文件路径,这样代码会更干净?您好,因为我对Java有点陌生。您有关于这方面的小教程吗?哦,是的anks alot:)两种方法都有效,但我认为我必须在双循环中使用它来获得声音的每个位置。现在我想问你推荐的一种。我可以在这个循环中阅读他选择按钮1、2、3等,但你如何解释按钮1->sound1(播放)哦,谢谢你,伙计,这帮了我很多。我还有一个问题。所以我还构建了一个上下文菜单,因为我想使用选项1 if(view.getId()==buttonsas[I]&&I==j)@ExiizZ-很抱歉,我对安卓知之甚少,因此我无法在这方面帮助你。我的建议是尽你所能尝试它,直到它按照你希望的方式工作或者你对它感到满意为止。也许用你的新版本发布另一个问题并在这个问题上标记安卓是明智的。祝你好运!
public void MainMedia (View view) {
// Traverse the buttonsas array to get the item the user just pressed.
for (int i=0; i<buttonsas.length; i++) {
// Check whether the item we got from the array is equal to the item we received as a parameter
if (view.getId() == buttonsas[i]) {
MainMedia.release();
// Since the sounds and buttons have a relation in the same position in two different arrays,
// just get the position we have depending on the selected item.
MainMedia = MediaPlayer.create(MainActivity.this, sounds[i]);
MainMedia.start();
}
}
}