运行 AsyncTask 时,我想显示一个进度指示器。这个存货很丑,所以我自己做了一个布局。然而问题就在这里,它是一个单独的布局,这意味着我需要一个新的 Activity 来显示它。
我以为我可以 startActivity(~progressActivity~) 然后……销毁它?但是似乎不可能阻止 parent 的 child Activity 。
我可以隐藏 AsyncTask-invoking-activity 上的进度指示器,然后在处理时让它显示并隐藏布局的其余部分。现在我的主布局中需要两个子布局,每次都隐藏一个。这听起来像是 hack,我不太喜欢它。
有什么建议吗?
最佳答案
如果您需要对 ProgressBar 进行更多控制,可以使用 WindowManager 在所有内容之上添加一个 View 。它可以在没有任何额外的布局、 Activity 或窗口的情况下完成。您可以像在常规 View 中一样控制动画、触摸、位置和可见性。完整的工作代码:
final ProgressBar view = new ProgressBar(TestActivity.this);
view.setBackgroundColor(0x7f000000);
final LayoutParams windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.CENTER;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;
new AsyncTask<Integer, Integer, Integer>() {
public void onPreExecute() {
// init your dialog here;
getWindowManager().addView(view, windowParams);
}
public void onPostExecute(Integer result) {
getWindowManager().removeView(view);
// process result;
}
@Override
protected Integer doInBackground(Integer... arg0) {
// do your things here
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}.execute();
关于执行 AsyncTask 时的 Android 自定义进度指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085874/