user3697344
user3697344

Reputation: 301

Android TextView.setText() does nothing in button onClickListener

I am trying to change the text of a TextView after clicking a button. The text will display a countdown of seconds so the setText() function gets called several times inside a loop. The text never changes until after the entire onClickTrain function is finished.

I'm using fragments.

The Log.d(...) displays everything perfectly so I know the process is okay.

public  View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View v = inflater.inflate(R.layout.fragment_classification, container, false);
    assert v != null;

    liveView = (TextView)v.findViewById(R.id.textView3);

    View trainButton = v.findViewById(R.id.train);
    trainButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v){
            onClickTrain(v);
        }
    });

    return v;
}

public void onClickTrain(View v) {

    for(int i=0;i<numGestures;i++) {//countdown to train each gesture
        for (int countDown = 3; countDown > 0; countDown--) {//count down from 3

            Log.d("Hold ", ListElements[i] + " in " + String.valueOf(countDown));
            liveView.setText("Hold " + ListElements[i] + " in " + String.valueOf(countDown));

            SystemClock.sleep(1000);//wait 1 second
        }
        fcalc.setTrain(true);
        SystemClock.sleep(100);
        while(fcalc.getTrain()){
            //wait until training data is full
        }
    }
    Log.d("size of train vector: ", String.valueOf(fcalc.samplesClassifier.size()));
    fcalc.Train();
    fcalc.setClassify(true);

}

Any idea why the text is not displaying? I have tried using handlers in several different places.

Any input is appreciated. Thanks.

Upvotes: 0

Views: 283

Answers (2)

Kobe M.
Kobe M.

Reputation: 40

You can use a handler to add a delay. If you use Thread.Sleep(5000) it will make the UI irresponsive.

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
      //Do something here
    }
}, 5000);

Upvotes: 0

Gabe Sechan
Gabe Sechan

Reputation: 93678

DO not sleep on the UI thread. This makes the app freeze. Redrawing requires the app to return control to the Looper in the event loop that calls your click handler. So if you sleep, your changes will not show.

Upvotes: 1

Related Questions