setText函数不会更改TextView

时间:2019-05-25 23:25:24

标签: java android

该应用程序以我希望的方式运行,我可以在Logcat中看到它 但文本视图未更改,并保留默认值 我也试图以编程方式更改按钮启用状态,但保持不变,什么也没有改变!

我都尝试过setText方法 String.valueof(int) 和 Integer.toString(int)

  

java

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         play =(Button) findViewById(R.id.button4);
         Pause =(Button) findViewById(R.id.button5);
        hourstext =(TextView) findViewById(R.id.textView1);
        mintext =(TextView) findViewById(R.id.textView2);
        sectext =(TextView) findViewById(R.id.textView3);


    }

    void playb(View v)  {


        while (!ispause) {
            sec = 0 ;
            while (sec < 60) {
                SystemClock.sleep(1000);
                sec++;
               sectext.setText(Integer.toString(sec));
                Log.d("this", "sec value=" + sec);
            }
            sec = 0;
            min++;
            Log.d("this","min value ="+min);

           mintext.setText(String.valueOf(min));

        }

    }
  

XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView3"
        android:layout_width="114dp"
        android:layout_height="94dp"
        android:layout_marginTop="159dp"
        android:layout_marginEnd="16dp"
        android:layout_x="274dp"
        android:layout_y="120dp"
        android:gravity="center|center_horizontal"
        android:text="00"
        android:textSize="40sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/pauseButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="72dp"
        android:layout_marginTop="116dp"
        android:layout_marginEnd="93dp"
        android:layout_x="217dp"
        android:layout_y="296dp"
        android:enabled="false"
        android:onClick="playb"
        android:text="Pause"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/playbutton"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />

    <Button
        android:id="@+id/playbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="70dp"
        android:layout_marginTop="116dp"
        android:layout_x="63dp"
        android:layout_y="293dp"
        android:onClick="playb"
        android:text="playb"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="120dp"
        android:layout_height="97dp"
        android:layout_marginTop="156dp"
        android:layout_marginEnd="17dp"
        android:layout_x="139dp"
        android:layout_y="117dp"
        android:gravity="center|center_horizontal"
        android:text="00"
        android:textSize="40sp"
        app:layout_constraintEnd_toStartOf="@+id/textView3"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="103dp"
        android:layout_height="94dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="159dp"
        android:layout_x="11dp"
        android:layout_y="117dp"
        android:gravity="center_horizontal|center_vertical"
        android:text="00"
        android:textSize="40sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

我没有收到任何错误消息!该应用程序继续运行,但没有更新的textView

我已包含我的XML代码

3 个答案:

答案 0 :(得分:0)

这可能与在主线程上运行所有内容有关。您永远不要在主线程上调用sleep,否则将阻止UI。

单击按钮时,您应该在后台线程上启动计数器。然后,您需要在主线程上更新TextView

可以使用RxJava轻松实现:

private Disposable disposable;

disposable = Observable.interval(1, 1, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(value -> {
            // Update UI
        });

要停止计数器:

disposable.dispose();

答案 1 :(得分:0)

如果您想对计数器进行60秒的计算,则可以使用此代码

long time=60;
        new CountDownTimer(time*1000, 1000)
         { 
    public void onTick(long millisUntilFinished) {
     mTextField.setText("seconds : " + (time-millisUntilFinished /1000));
     } 
        public void onFinish() {
     mTextField.setText("done!"); 
    } 
        }.start();

答案 2 :(得分:-1)

在尝试解决此问题之前,请先了解其原因

原因

当您调用View.setText()时,Android实际上不会立即设置文本。它将所有这些设置好的文本工作推送到主线程的队列中,以便在有空闲时间时稍后进行。

让我们尝试运行此块,您会注意到,直到while循环完成之前,View.setText()不会完成。

void playb(View v) {
    min = 0
    while (min < 1000000) {
        min++
        Log.d("this", "min value =$min")

        mintext.setText(String.valueOf(min))
    }
}

因此,在您的情况下,实际上仍将设置TextView,但是直到while循环结束时您才能看到更改。

解决方案

您应该将此while循环移动到另一个线程,只需为此使用AsyncTask或HandlerThread

例如使用HandlerThread:

void playb() {

    // Start a new background thread
    HandlerThread thread = new HandlerThread("");
    thread.start();

    // Obtain the handler of new background thread
    Handler handler = new Handler(thread.getLooper());

    // Obtain the handler of main thread (UI Thread)
    final Handler mainHandler = new Handler(this.getMainLooper());

    // Create a runnable and send it to background thread to execute
    handler.post(new Runnable() {

        public final void run() {

            // Do the job
            int min = 0;
            while(true) {
                int sec = 0;
                while(sec < 60) {
                    SystemClock.sleep(1000L);
                    sec ++;
                    final int currentSec = sec;

                    // Send the update-text job to main thread to execute
                    mainHandler.post(new Runnable() {
                        public final void run() {
                            secText.setText(currentSec);
                        }
                    });
                }
                sec = 0;
                min++;
                final int currentMin = min;

                // Send the update-text job to main thread to execute
                mainHandler.post(new Runnable() {
                    public final void run() {
                        minText.setText(currentMin);
                    }
                });
            }
        }
    });
}