Android TextView.setText无法按预期工作
**我配置了一个简单的单文本视图布局(见下面的代码),将显示从10更改为20。我看到的是显示“20”。我的代码如下。想知道为什么只显示最后一个数字(“20”)而忽略中间数字(10到19))Android TextView.setText无法按预期工作,android,textview,Android,Textview,**我配置了一个简单的单文本视图布局(见下面的代码),将显示从10更改为20。我看到的是显示“20”。我的代码如下。想知道为什么只显示最后一个数字(“20”)而忽略中间数字(10到19)) package com.example.test; 导入android.R.string; 导入android.os.Bundle; 导入android.app.Activity; 导入android.view.Menu; 导入android.widget.TextView; 导入android.widget
package com.example.test;
导入android.R.string;
导入android.os.Bundle;
导入android.app.Activity;
导入android.view.Menu;
导入android.widget.TextView;
导入android.widget.Toast;
公共类测试活动扩展了活动{
公共文本视图mytv;
公共土司;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
int i=10;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_测试);
mytv=(TextView)findviewbyd(R.id.myhw);
mtoast=Toast.makeText(this,String.valueOf(i),Toast.LENGTH\u LONG);
而(i++<20){
mtoast.setText(String.valueOf(i));
mtoast.show();
mytv.setText(String.valueOf(i));
试一试{
睡眠(5000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.test,menu);
返回true;
}
}
相关布局如下。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".TestActivity" >
<TextView
android:id="@+id/myhw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
因为只有在调用
onResume
并在显示活动之后才会显示视图,所以您所要做的就是在onCreate
方法中更改视图内容,在onCreate
之后,活动转到onStart
和onResume
,因此当onCreate
完成时,文本视图值为20,在onResume
之后,它将值设置为20。
有关更多信息,请参阅以下活动生命周期:
更进一步:一个
线程。睡眠
不是更新GUI并观察其变化的正确方法。它将采用的值是最后一个值。活动将被阻止,直到显示最后一个
如果您想看到这种效果,您应该编程一个线程,该线程每X秒与主线程通信一次,并且主线程应该监听线程以更改它
例如,您可以使用和onProgressUpdate
用一些代码编辑:
main活动
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume(){
super.onResume();
/* Running AsyncTask */
myAsyncTask bkg = new myAsyncTask();
/* I'll pass an integer parameter: milliseconds to wait. */
bkg.execute(3000);
}
private class myAsyncTask extends AsyncTask<Integer, Integer, String> {
@Override
protected void onPreExecute() {
/* TODO: Do BEFORE background process */
Toast.makeText(getApplicationContext(),"I'm going to do a background task!", Toast.LENGTH_SHORT).show();
}
@Override
protected String doInBackground(Integer... parameters) {
/* TODO: What to do in Background */
/* Retrieving parameter passed */
int milliseconds = parameters[0];
try {
Thread.sleep(milliseconds);
publishProgress(milliseconds); /* Will prompt that value */
} catch (InterruptedException e) {
e.printStackTrace();
return "ERROR";
}
int i = 0;
while (i++ < 20) {
try {
Thread.sleep(milliseconds);
publishProgress(i);
} catch (InterruptedException e) {
e.printStackTrace();
return "ERROR";
}
}
return "OK";
}
@Override
protected void onPostExecute(String result) {
/* TODO: After execution of thread */
if(result.equals("OK"))
Toast.makeText(getApplicationContext(),"Correctly Processed", Toast.LENGTH_SHORT).show();
if(result.equals("ERROR"))
Toast.makeText(getApplicationContext(),"Failed", Toast.LENGTH_SHORT).show();
}
@Override
protected void onProgressUpdate(Integer... values) {
/* TODO: Here you can access UI elements as your TextView */
TextView tv = (TextView) findViewById(R.id.tvExample);
tv.setText(values[0]+"");
}
}
}
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@凌驾
受保护的void onResume(){
super.onResume();
/*运行异步任务*/
myAsyncTask bkg=新建myAsyncTask();
/*我将传递一个整数参数:毫秒等待*/
bkg.execute(3000);
}
私有类myAsyncTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
/*TODO:在后台处理之前执行*/
Toast.makeText(getApplicationContext(),“我要做一个后台任务!”,Toast.LENGTH\u SHORT.show();
}
@凌驾
受保护的字符串doInBackground(整数…参数){
/*TODO:在后台做什么*/
/*正在检索传递的参数*/
int毫秒=参数[0];
试一试{
睡眠(毫秒);
publishProgress(毫秒);/*将提示该值*/
}捕捉(中断异常e){
e、 printStackTrace();
返回“错误”;
}
int i=0;
而(i++<20){
试一试{
睡眠(毫秒);
出版进度(一);
}捕捉(中断异常e){
e、 printStackTrace();
返回“错误”;
}
}
返回“OK”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
/*TODO:执行线程后*/
如果(结果等于(“确定”))
Toast.makeText(getApplicationContext(),“正确处理”,Toast.LENGTH\u SHORT.show();
if(result.equals(“ERROR”))
Toast.makeText(getApplicationContext(),“Failed”,Toast.LENGTH_SHORT.show();
}
@凌驾
受保护的void onProgressUpdate(整型…值){
/*TODO:在这里,您可以作为文本视图访问UI元素*/
TextView tv=(TextView)findViewById(R.id.tvExample);
tv.setText(值[0]+“”);
}
}
}
layout/main_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.myapplication2.app.MainActivity"
android:id="@+id/whatever">
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/tvExample" />
您不应该首先休眠UI线程 您可能想做的是使用另一个线程,让它休眠几秒钟,每次更新UI时,使用UI(主)线程。您可以通过多种方式完成此任务,但simples可能正在使用
AsyncTask
,如下所示:
public class MyActivity extends Activity {
public TextView mytv;
public Toast mtoast;
private int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
i = 10;
mytv = (TextView) findViewById(R.id.myhw);
mtoast = Toast.makeText(this, String.valueOf(i), Toast.LENGTH_LONG);
new AsyncTask<Void, String, Void>() {
@Override
protected Void doInBackground(Void... voids) {
while (i < 20) {
publishProgress(String.valueOf(i));
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
mtoast.setText(values[0]);
mtoast.show();
mytv.setText(values[0]);
}
}.execute();
}
}
公共类MyActivity扩展活动{
公共文本视图mytv;
公共土司;
私人互联网i;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
i=10;
mytv=(TextView)findviewbyd(R.id.myhw);
mtoast=Toast.makeText(this,String.valueOf(i),Toast.LENGTH\u LONG);
新建异步任务(){
@凌驾
受保护的空位背景(空位…空位){
而(i<20){
出版进度(String.valueOf(i));
试一试{
睡眠(5000);
}捕捉(中断异常e){
e、 printStackTrace();
}
i++;
}
返回null;
}
@凌驾
public class MyActivity extends Activity {
public TextView mytv;
public Toast mtoast;
private int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
i = 10;
mytv = (TextView) findViewById(R.id.myhw);
mtoast = Toast.makeText(this, String.valueOf(i), Toast.LENGTH_LONG);
new AsyncTask<Void, String, Void>() {
@Override
protected Void doInBackground(Void... voids) {
while (i < 20) {
publishProgress(String.valueOf(i));
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
mtoast.setText(values[0]);
mtoast.show();
mytv.setText(values[0]);
}
}.execute();
}
}
private Handler mHandler;
public TextView mytv;
private int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_toast_showing_acounter);
mytv = (TextView) findViewById(R.id.myhw);
mHandler = new Handler();
i = 10;
scheduleHandler();
}
private void scheduleHandler() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
showCounter();
if (i < 20) {
scheduleHandler();
}
}
}, 5000);
}
private void showCounter() {
Toast.makeText(this, String.valueOf(i), Toast.LENGTH_LONG).show();
mytv.setText(String.valueOf(i));
i++;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.test, menu);
return true;
}
final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (counter == 20) {
timer.cancel();
counter = 0;
time.setText("Ta-da! I'm Done ");
}else{
counter += 1;
if (time != null)
time.setText(String.valueOf(counter));
}
}
});
}
}, delay, period);