有人可以告诉我如何从一个函数更新控件Textview Android吗?我已深入搜索互联网并看到许多人提出同样的问题,我测试了线程但无法工作,有人有一个简单的工作示例吗?例如,调用一个函数(在循环中运行几次)并且函数在TextView中写入,但问题是在函数未完成运行之前,它会向我显示文本。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
while(condition) //here freezes the UI and the text in textview only shows when the loop ends
{
HardWork();
}
}
public void HardWork() {
txtProgreso.append("Test Line" + "\n\n");
};
提前致谢。
答案 0 :(得分:5)
如果我理解正确的话 在这里使用AsyncTask,因此您可以在onProgressUpdate方法
中更新textviewprivate class SomeTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
while(condition) {
//do more
publishProgress("Some text value to you textview");
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
txtProgreso.append(values[0]);
}
}
答案 1 :(得分:3)
我认为你要问的是“我如何强制我的TextView显示其更新内容而不将控制权返回给runloop?” (即,退出你的职能)。
如果是这样,我担心你运气不好,这样的事情与Android的UI模型无关。最接近这一点的可能是跟踪你的循环状态,并设置一个定时器,它将调用一个函数来更新TextView。
这是一个例子。假设您要将文本“this is a test”放入TextView中,一次只能放一个字符:
private Handler mHandler = new Handler(); private String desiredText = new String("This is a test"); private Runnable mUpdateTextView = new Runnable() { public void run() { TextView textView = (TextView)findViewById(R.id.myTextView); int lengthSoFar = textView.getText().length(); if (lengthSoFar < desiredText.length()) { mTextView.setText(desiredText.substring(0, lengthSoFar + 1)); mHandler.postDelayed(100, mUpdateTextView); } } }; protected void onStart() { mHandler.postDelayed(100, mUpdateTextView); }
我认为我的一些对象可见性在这里是不正确的,并且我没有方便测试的Android环境,但是你得到了一般的想法。而不是处理程序,你也可以使用计时器,但它更重要,所以它取决于你想要更新UI的频率。
答案 2 :(得分:1)
通过执行以下操作即可获得textview。
TextView myTextView = (TextView)findViewById(R.id.textViewsId);
然后,您可以使用这些功能更改TextView。例如,您可以使用以下代码设置文本。
myTextView.setText("New text example");
您正在尝试执行的控件是否还有其他更新?