activity_main.xml中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_marginTop="153dp"
android:layout_toRightOf="@+id/textView1"
android:onClick="adelante"
android:text="Button" />
</RelativeLayout>
MainActivity.java
package com.example.pruebamusica;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
MediaPlayer mp[]=new MediaPlayer[6];
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textView1);
for (int i=0; i<6; i++){
String sonido = "raw/g" + (i+1);
int resID = getResources().getIdentifier(sonido, null, this.getPackageName());
mp[i]= MediaPlayer.create(this, resID);
}
}
public void adelante (View v){
for (int i=0; i<6; i++){
tv.setText("Sonido " + i);
mp[i].start();
do { // ESPERAMOS A QUE EL SONIDO ACABE.
} while (mp[i].isPlaying());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
我正在尝试播放3到5秒的6种声音,我想在for {}的每个循环中更新textView1
,但textView1
只更新为“Sonido 5” 。
有什么建议吗?
答案 0 :(得分:0)
for (int i=0; i<6; i++)
你将从0变为5.如果你想进入1-6,你需要做tv.setText("Sonido " + (i+1));
答案 1 :(得分:0)
请勿在{{1}}中执行此操作。您应该只使用onCreate()
来设置活动的最低要求。
在这种情况下,UI甚至还没有构建,所以当你最终允许onCreate()
返回时,任何更新都只显示最后一个,并且构建UI的活动。
使用onCreate()
或更高版本。
答案 2 :(得分:0)
adelante会把UI线程搞得一团糟。在完成所有任务之前,UI不会更新。所以你只能看到最终的结果。 请使用Handler和线程来更新UI。
您应该使用AsyncTask:
MySyncTask extends AsyncTask<Void, Integer, Void> {
protected Long doInBackground(URL... urls) {
for (int i=0; i<6; i++){
publishProgress(i);
mp[i].start();
do { // ESPERAMOS A QUE EL SONIDO ACABE.
} while (mp[i].isPlaying());
}
}
protected void onProgressUpdate(Integer... progress) {
tv.setText("xxx play:" + i);
}
}
答案 3 :(得分:0)
首先,使用do {} while()循环来等待音乐的结束是非常危险的,因为它收集资源什么都不做,所以,你必须以异步的方式思考它。 / p>
我建议您将播放器作为AsyncTask管理(在Android编程中必须!),其中,在“onPreExecute()”中,您可以刷新电视TextView,当它完成时,从asynctask中取出,触发新戏。
另一种选择是使用“听众”等待比赛结束。
答案 4 :(得分:0)
你可以使用任何循环,,, ...但是如果是关于时间的话。即你想播放声音几秒钟你的for循环将获得最后一个,即最近更新的i值... 所以我想获得每一秒的更新值,你必须使用Handler()每秒更新一个值.....为什么你得到最近的i in for loop