在我的新应用程序中,我需要在进行某些处理(例如向服务器发送数据、从web服务读取数据等)时显示动画。
像这样的:
android - 如何实现加载屏幕以防止用户在进行后台处理时与界面交互-LMLPHP
当我想实现类似的功能时,我经常这样做:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/sincronizarSpinnerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" >

        <ProgressBar
            android:id="@+id/pbHeaderProgress"
            style="@android:style/Widget.ProgressBar.Inverse"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true" >
        </ProgressBar>
    </RelativeLayout>


    <RelativeLayout>

      <!--Main content here-->

    </RelativeLayout>

</LinearLayout>

如您所见,我有两个嵌套的相对布局。默认情况下,第一个布局是不可见的(android:visibility="gone"),我只在启动服务、异步任务或异步技术时使其可见。
虽然我以前使用过这种方法,但是现在我的主布局(应该放在第二个相对布局中的布局)更加复杂了,我不确定通过在我的活动中添加另一个嵌套级别来使事情更加复杂是不是一个好主意。
有没有什么方法可以避免在所有的
需要显示微调器动画的活动?也许
有些模式或好的做法我不知道。
我真的需要担心在我的
活动,知道我已经有两个或三个层次了吗?
谢谢。

最佳答案

您可以简单地使用ProgressDialogsetCanceledOnTouchOutside(false),这样当您的AsyncTask工作时,用户就不能触摸外部。
这是我的结构代码,我几乎在我的项目中使用AsyncTask。您可以应用于您的项目:

public class DownloadTask extends AsyncTask<Void, Void, Void> {
    private ProgressDialog mProgressDialog;

    private Context mContext;

    public DownloadTask(Context context) {
        this.mContext = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        mProgressDialog = ProgressDialog.show(mContext, "Downloading", "Downloading Data ...");
        mProgressDialog.setCanceledOnTouchOutside(false); // main method that force user cannot click outside
        mProgressDialog.setCancelable(true);
        mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dlg) {
                DownloadTask.this.cancel(true);
            }
        });
    }

    @Override
    protected Void doInBackground(Void... params) {
        // do some background work here

    }

    @Override
    protected void onPostExecute(Void result) {
        if (this.isCancelled()) {
            result = null;
            return;
        }

        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
        }

    }
}

希望这个帮助:)

10-08 06:54