我正在尝试制作一个类似书籍的应用程序,其中包含图片和文字。我为此使用了 fragment ,并添加了一个声音,当 fragment 页面可见时开始,当它不可见时停止。
我现在正在尝试突出显示画外音中的一个词。到目前为止,这是我的代码
fragment 中:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// Make sure that we are currently visible
if (this.isVisible()) {
if(MainActivity.soundOn){
if(!MainActivity.mediaPlayer.isPlaying()){
try {
MainActivity.mediaPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MainActivity.mediaPlayer.start();
MainActivity.start(getActivity(), sentence);
}
//MainActivity.test(sentence);
MainActivity.mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//MainActivity.start();
}
});
}
// If we are becoming invisible, then...
if (!isVisibleToUser || !MainActivity.soundOn) {
stopPlaying(getActivity());
}
}
}
在主要 Activity 中:
public static void start(Activity activity, Sentence sent){
//textControl.start();
try{
player = new Player(activity);
player.set(sent, textControl);
textControl.draw(sent, sent.words.get(0));
//while the mediaplayer is playing the voice over
while(mediaPlayer.isPlaying())
{
player.run();
}
}
catch(Exception e){
e.printStackTrace();
}
线程,我已经删除了大部分代码以进行测试和可读性:
class Player extends Thread{
public int time;
public TextController control;
public int i = 1;
TextView tv;
private WeakReference<Activity> mActivity;
private Sentence sentence = null;
public Player(Activity activity) {
mActivity = new WeakReference<Activity>(activity);
}
public void set(Sentence _sentence, TextController _control){
sentence = _sentence;
control = _control;
}
@Override
public void run()
{
final Activity activity = mActivity.get();
tv = (TextView) activity.findViewById(R.id.textView1);
activity.runOnUiThread(new Runnable() {
public void run() {
tv.setText("Testing");
//other stuff
}
});
}
}
我想知道为什么代码“tv.setText("Testing");"不会在执行后立即更新 textview 吗?相反,它会在 setUserVisibleHint(boolean isVisibleToUser) 方法完成后的某个时间更新 TextView 。
我也乐于接受有关更好的方法的建议。
如果您想了解有关任务和问题的更多背景信息,请随时询问,因为我的信息已经很简短了,谢谢!
带有 textView 的 fragment 的 XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:onClick="toggleAction">
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal"
android:text="@string/fragment1"
android:textSize="50sp" />
</LinearLayout>
最佳答案
我无法使用此线程解决此问题,因此尝试使用 AsyncTask。这通过在 onProgressUpdate 中更新 TextView 非常有效
@Override
protected void onProgressUpdate(Spannable... result){
view.setText(result[0]);
view.invalidate();
}
关于android - 从 Thread 更新 TextView 仅在 Thread 之后更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21394012/