3

我想在后台执行一些指令时显示一个进度条,但我不想锁定屏幕。此代码正在锁定屏幕:

private class ConvertDataInBackground extends AsyncTask<Params, Void, Boolean> {

        private MyProgressDialog mProgressDialog;

        @Override
        public void onPreExecute() {
            if(mProgressDialog == null)
                mProgressDialog = MyProgressDialog.show(mActivity, null, null);
        }

        @Override
        protected Boolean doInBackground(Params...params) {
            boolean conversionResult = executeConversion(params[0].item1, params[0].item2, params[0].item3);
            return conversionResult;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            try {
                if(mProgressDialog.isShowing()) 
                    mProgressDialog.dismiss();
                if(result) {
                    Toast toast = Toast.makeText(mActivity, R.string.conversion_result, Toast.LENGTH_SHORT);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

在后台执行指令可能需要一段时间,我希望用户能够使用界面。你是否知道我们可以使用界面,而progressDialog 显示在顶部?

4

2 回答 2

4

Android 中的对话框通常是模态的。您可以尝试创建对话框,然后将 FLAG_NOT_TOUCH_MODAL 添加到其窗口参数 - 但我不确定它是否会起作用。它背后的想法是这样的:

ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage(...);
dialog.setTitle(...);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

同时请注意,将 a 添加到 Activity 的布局中并在需要时显示它可能比创建对话框更容易ProgressBar——事实上,这是 Google 文档所推荐的。 Android 开发者的对话框指南有这样的说法:

避免 ProgressDialog

Android 包含另一个名为的对话框类ProgressDialog,它显示带有进度条的对话框。但是,如果您需要指示加载或不确定的进度,则应遵循设计指南并在布局中Progress & Activity使用 a 。ProgressBar

于 2013-08-08T13:32:35.227 回答
2

我认为在您的活动中,您必须指定 FLAG_KEEP_SCREEN_ON 标志:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

对我来说,它奏效了。

于 2013-08-08T11:00:14.797 回答