为什么此更新失败?

时间:2013-04-17 05:57:40

标签: android textview

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” 。 有什么建议吗?

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