Диалог прогресса закрывается при касании экрана
Я использую 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
исчезает, но получает все данные.
Ответы
Ответ 1
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 (4.0.1), также протестированной в ОС (2.6.3)
Ответ 2
Добавьте это в свой диалог:
yourDialog.setCanceledOnTouchOutside(false);
Таким образом, вы можете коснуться экрана, и диалог не будет отменен.
ИЗМЕНИТЬ
Если вы используете DialogFragment
, вы должны использовать следующий фрагмент кода перед вызовом show (FragmentManager mng, String tag):
Подробнее здесь.
dialogFragment.setCancelable(false);
РЕДАКТИРОВАТЬ 2
Будьте осторожны с ProgressDialog
, потому что с Android Oreo (v8.0) он устарел.
Ответ 3
Когда вы выполняете определенный процесс загрузки данных, вы можете сделать диалог прогресса неспособным отменить, используя приведенный ниже код:
mDialog.setCancelable(false);
mDialog.setCanceledOnTouchOutside(false);
mDialog.setOnCancelListener(new Dialog.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// DO SOME STUFF HERE
}
}
Также вы можете перейти на панель выполнения в панели действий, если вы используете в своем проекте.
Надеюсь, это поможет вам.
Ответ 4
Создайте класс следующим образом:
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();