在Activity更改之前TextView.setVisibility无效

时间:2013-07-04 08:02:36

标签: android textview

我有一些看起来像这样的代码:

loading = (TextView) findViewById(R.id.loading);

public void enterButton(View v) { // This is a button
    loading.setVisibility(TextView.VISIBLE); // For some reason this does not happen...
    MyApp.initialize(); // ... before this is completed
    Intent i = new Intent(this, AnotherActivity.class);
    startActivityForResult(i, 0);
}

loading是一个简单地说“正在加载......”的TextView。 MyApp.initialize()是一种计算量很大的方法,可以设置AnotherActivity。运行需要几秒钟,这就是我想要显示“正在加载...”消息的原因。

问题是大多数时候loading.setVisibility(TextView.VISIBLE)似乎没有做任何事情。我从来没有看过文字。在极少数情况下,我会在活动发生变化之前看到“正在加载...”。有些东西告诉我,Android正在将stack.setVisibility(TextView.VISIBLE)放在堆栈上,然后在MyApp.initialize()完成之后才开始执行,这显然为时已晚。我希望在MyApp.initialize()开始之前出现“Loading ...”。

Animation BEFORE activity change看起来很接近,但.setAnimationListener不适用于TextView。 TextView有类似的东西吗?我用了一个破解但应用程序挂了:

loading.setVisibility(TextView.VISIBLE); 
loading.setOnEditorActionListener(new TextView.OnEditorActionListener() {               
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        MyApp.initialize();
        Intent i = new Intent(MyApp.getInstance(), AnotherActivity.class);
        startActivityForResult(i, 0);
        return true;
    }
});

有什么建议吗?谢谢。

4 个答案:

答案 0 :(得分:1)

我不确定(因为看你的代码并不明显),但似乎你在一个线程中做了所有事情。更改可见性调用invalidate方法,这将导致在NEXT DRAW CALL中重绘视图。 TextView仅在下次绘制调用后才可见,这可能不会因活动更改而发生。

您应该照常设置可见性,并使用初始化和意图调用启动新线程。也许你也应该手动调用invalidate。这样就可以了。您的应用将在后台初始化,绘图线程将显示TextView。

答案 1 :(得分:1)

你应该使用thread或asynctask进行init工作。

loading = (TextView) findViewById(R.id.loading);
Handler h = new Handler();
public void enterButton(View v) { // This is a button
    loading.setVisibility(TextView.VISIBLE);

    new Thread(new Runnable() {
        @Override
        public void run() {
            MyApp.initialize();
            h.post(new Runnable() {
                @Override
                public void run() {
                    Intent i = new Intent(this, AnotherActivity.class);
                    startActivityForResult(i, 0);
                }
            });
        }
    }).start();
}

答案 2 :(得分:1)

我建议您尝试使用异步任务显示文本并在MyApp.initialize()中执行doInBackground并在onPostExecute中调用意图,类似

private ProcessDataAsync processDataAsync;

    public class ProcessDataAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            MyApp.initialize();

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            Intent i = new Intent(context, AnotherActivity.class);
            startActivityForResult(i, 0);

        }

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

            loading.setVisibility(View.VISIBLE);

        }
    }

然后将onClickListener中的asynctask称为

    processDataAsync = new ProcessDataAsync();
    processDataAsync.execute((Void[]) null);

希望这会有所帮助。

答案 3 :(得分:0)

试试这个

loading.setVisibility(View.VISIBLE);