web-dev-qa-db-ja.com

画面にタッチすると進行ダイアログが閉じます

スレッドでProgressDialogを使用します。 onButtonClickではスレッドが開始されますが、画面上のどこかにタッチするとProgressDialogが閉じます。

どうすればこれを防ぐことができますか?

private void ButtonClick(View view) {

    btn1 = (Button) view.findViewById(R.id.btn1);
    btn1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            GetStudentData();
        }
    });
}

private synchronized void GetStudentData() {  
    try {
        // Thread to display loader
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();
                dialog = Msg.ShowProgressDialogBox(
                    getActivity(),
                    dialog,
                    "Please wait while we fetch the student data...");
                Looper.loop();
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                String studentData="Kailas";
            }   
        }
    } catch(Exception ex {
    }
}

更新

画面をタッチするとProgressDialogが消えますが、すべてのデータを取得します。

16
Kailas
private synchronized void GetStudentData() {

    try {
    // Thread to display loader
    new Thread() {
        @Override
        public void run() {
            Looper.prepare();
            dialog = Msg.ShowProgressDialogBox(getActivity(),
                    dialog,
                    "Please wait while we fetch the student data...");
            dialog.setCanceledOnTouchOutside(getRetainInstance());
            Looper.loop();
        }
    }.start();

    new Thread() {

        @Override
        public void run() {
                  String studentData="Kailas";
         }   
    }
}

私はこの行を使用しましたdialog.setCanceledOnTouchOutside(getRetainInstance());、それは私のAndroidデバイスOSで正常に動作しました(4.0.1)もOSでテスト済み(2.6.3)

5
Kailas

これをダイアログに追加します。

yourDialog.setCanceledOnTouchOutside(false);

このようにして、画面をタッチすることができ、ダイアログはキャンセルされません。

[〜#〜]編集[〜#〜]

DialogFragmentを使用している場合は、show(FragmentManager mng、String tag)を呼び出す前に、次のコードスニペットを使用する必要があります。

詳細 ここ

dialogFragment.setCancelable(false);

EDIT 2

ProgressDialogには注意してください。Android Oreo(v8.0)では廃止されているためです。

52
JJ86

特定の重要なデータのダウンロードプロセスを行っている場合、以下のコードを使用して進行ダイアログをキャンセルできないようにすることができます。

mDialog.setCancelable(false);
mDialog.setCanceledOnTouchOutside(false);
mDialog.setOnCancelListener(new Dialog.OnCancelListener() {

    @Override
    public void onCancel(DialogInterface dialog) {
        // DO SOME STUFF HERE
    }
}

また、プロジェクトで使用している場合は、アクションバーの進行状況バーに移動できます。

それがあなたを助けることを願っています。

3
Rushabh Patel

次のようなクラスを作成します。

public class Progresss {

    static ProgressDialog dialog;

    public static void start(Context context) {
        dialog = new ProgressDialog(context);
        try {
            dialog.show();
        } catch (BadTokenException e) {
        }
        dialog.setCancelable(false);
        dialog.setContentView(R.layout.progressdialog123);
        // dialog.setMessage(Message);
        // return dialog;
    }

    public static void stop() {
        if(dialog!=null)
            dialog.dismiss();
    }
}

これはレイアウトファイルです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center"
    Android:background="@Android:color/transparent" >

    <ProgressBar
        Android:id="@+id/progressBar1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true" />

</RelativeLayout>

使い方は次のとおりです:

Progresss.start(context);
Progresss.stop();
2
Ali