Java Android TextView.setText()在button onClickListener中不执行任何操作
我试图在单击按钮后更改TextView的文本。文本将显示秒的倒计时,以便在循环中多次调用Java Android TextView.setText()在button onClickListener中不执行任何操作,java,android,android-fragments,settext,Java,Android,Android Fragments,Settext,我试图在单击按钮后更改TextView的文本。文本将显示秒的倒计时,以便在循环中多次调用setText()函数。文本在整个onClickTrain功能完成后才会更改 我用的是碎片 Log.d(…)完美地显示了所有内容,因此我知道这个过程是正常的 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View v = inflat
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);
}
创建视图时的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
最终视图v=充气机。充气(R.layout.fragment_分类,容器,假);
断言v!=null;
liveView=(TextView)v.findViewById(R.id.textView3);
查看列车按钮=v.findviewbyd(R.id.train);
trainButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
列车(v);
}
});
返回v;
}
公共列车(视图五){
对于(inti=0;i0;倒计时--){//从3开始倒计时
Log.d(“+String.valueOf(countDown)”中的“Hold”,liselements[i]+”;
liveView.setText(“Hold”+String.valueOf(countDown)中的listerments[i]+”;
SystemClock.sleep(1000);//等待1秒
}
fcalc.setTrain(正确);
系统时钟。睡眠(100);
while(fcalc.getTrain()){
//等待训练数据已满
}
}
Log.d(“序列向量的大小:”,String.valueOf(fcalc.samplesClassifier.size());
fcalc.Train();
fcalc.setClassify(真);
}
知道文本为什么没有显示吗?我尝试在几个不同的地方使用处理程序
欢迎您的任何意见。谢谢。不要在UI线程上睡觉。这使得应用程序冻结。重绘要求应用程序将控制权返回到调用单击处理程序的事件循环中的循环器。因此,如果您睡眠,您的更改将不会显示。您可以使用处理程序添加延迟。如果您使用
Thread.Sleep(5000)
将使UI不负责任
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Do something here
}
}, 5000);
好的,谢谢。您能推荐一种更好的暂停1秒的方法吗?在主线程上为处理程序启动一部分,然后在处理程序中执行剩余的代码。或者,将所有这些代码移到自己的线程中,然后发回您的线程以进行ui更新(在非主线程上睡觉也可以),为什么不使用
Handler.postDelayed()
?谢谢您的帮助。这让我一路走到那里。我需要的额外部分是包括mHandler.postDelayed(这个,1000);在…内