1

运行 AsyncTask 时,我想显示进度指示器。这个股票很难看,所以我自己做了一个布局。然而问题在于,它是一个单独的布局,这意味着我需要一个新的活动来显示它。

我以为我可以 startActivity(~progressActivity~) 然后......销毁它?但似乎不可能阻止父母的孩子活动。

我可以隐藏 AsyncTask-invoking-activity 上的进度指示器,然后在处理时让它显示并隐藏布局的其余部分。现在我的主布局中需要两个子布局,并且每次都隐藏一个。这听起来像一个黑客,我不太喜欢它。

有什么建议么?

4

2 回答 2

2

如果您需要对 ProgressBar 进行更多控制,可以使用 WindowManager 在所有内容之上添加视图。无需任何额外的布局、活动或窗口即可完成。您可以控制动画、触摸、位置和可见性,就像在常规视图的情况下一样。完整的工作代码:

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();
于 2013-02-26T10:26:20.197 回答
0
new AsyncTask<Params, Progress, Result>() {
   Dialog dlg = new Dialog();
   View customProgress;
   public void onPreExecute() {
       //init your dialog here;
       View customProgress = LayoutInflater.from(CurrentActivity.this).inflate(R.layout.your_progress_layout, null, false);
       dialog.setContentView(view);
       dialog.show();
   }
   public Result doInBackground(Params... params) {
    // do something
    publishProgress(progress);  
   }
   public void onProgressUpdate(Progress progress) {
    // do something with progressView;
   }
   public void onPostExecute(Result result) {
      dlg.dissmiss();
      // process result;
   }
}.execute();

这是可能的方式(仅示例,可能包含错误)

于 2013-02-26T10:06:09.167 回答