Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android TextView.setText无法按预期工作_Android_Textview - Fatal编程技术网

Android TextView.setText无法按预期工作

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

**我配置了一个简单的单文本视图布局(见下面的代码),将显示从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.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);