我有一些看起来像这样的代码:
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;
}
});
有什么建议吗?谢谢。
答案 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);