【问题标题】:Android TextView.setText() does nothing in button onClickListenerAndroid TextView.setText() 在按钮 onClickListener 中什么都不做
【发布时间】:2017-07-10 21:33:33
【问题描述】:

我试图在单击按钮后更改 TextView 的文本。文本将显示倒计时秒数,因此setText() 函数在循环内被多次调用。在整个 onClickTrain 函数完成之前,文本永远不会改变。

我正在使用片段。

Log.d(...) 完美显示所有内容,因此我知道该过程没问题。

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);

}

知道为什么文本没有显示吗?我已经尝试在几个不同的地方使用处理程序。

感谢任何输入。谢谢。

【问题讨论】:

    标签: java android android-fragments settext


    【解决方案1】:

    不要在 UI 线程上休眠。这会使应用程序冻结。重绘要求应用程序在调用您的点击处理程序的事件循环中将控制权返回给 Looper。因此,如果您睡觉,您的更改将不会显示。

    【讨论】:

    • 好的,谢谢。您能推荐一种更好的暂停 1 秒的方法吗?
    • 在主线程上将一个runnable分配给处理程序,然后在处理程序中执行剩余的代码。或者,将所有这些代码移到它自己的线程中,然后发回你的线程以进行 ui 更新(可以在非主线程上休眠)
    • 你为什么不用Handler.postDelayed()?
    【解决方案2】:

    您可以使用处理程序来添加延迟。如果您使用Thread.Sleep(5000),它将使 UI 无响应。

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

    【讨论】:

    • 感谢您的帮助。这让我大部分时间都在那里。我需要的额外一点是包括 mHandler.postDelayed(this, 1000);里面
    猜你喜欢
    • 2016-07-24
    • 2011-09-10
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多