代码之家  ›  专栏  ›  技术社区  ›  user3697344

Android TextView。setText()在按钮onClickListener中不执行任何操作

  •  0
  • user3697344  · 技术社区  · 7 年前

    我试图在单击按钮后更改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);
    
    }
    

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gabe Sechan    7 年前

    不要在UI线程上睡眠。这使应用程序冻结。重画需要应用程序将控制权返回到调用单击处理程序的事件循环中的循环器。因此,如果你睡觉,你的变化将不会显示。

        2
  •  0
  •   Kobe M.    7 年前

    您可以使用处理程序添加延迟。如果您使用 Thread.Sleep(5000)

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