Как показать диалоговое окно, чтобы подтвердить, что пользователь хочет выйти из Android Activity? - PullRequest
265 голосов
/ 13 февраля 2010

Я пытался показать "Вы хотите выйти?" тип диалога, когда пользователь пытается выйти из Activity.

Однако я не могу найти соответствующие хуки API. Activity.onUserLeaveHint() изначально выглядело многообещающе, но я не могу найти способ остановить завершение Действия.

Ответы [ 14 ]

1 голос
/ 11 марта 2018

Другой альтернативой может быть показ Toast / Snackbar при первом нажатии назад с просьбой снова вернуться к выходу , что намного менее навязчиво, чем показ AlertDialog для подтверждения если пользователь хочет выйти из приложения.

Вы можете использовать DoubleBackPress Android Library для достижения этого с помощью нескольких строк кода. Пример GIF, демонстрирующий похожее поведение.

Для начала добавьте зависимость в ваше приложение:

dependencies {
    implementation 'com.github.kaushikthedeveloper:double-back-press:0.0.1'
}

Далее, в вашей Деятельности, реализуйте требуемое поведение.

// set the Toast to be shown on FirstBackPress (ToastDisplay - builtin template)
// can be replaced by custom action (new FirstBackPressAction{...})
FirstBackPressAction firstBackPressAction = new ToastDisplay().standard(this);

// set the Action on DoubleBackPress
DoubleBackPressAction doubleBackPressAction = new DoubleBackPressAction() {
    @Override
    public void actionCall() {
        // TODO : Exit the application
        finish();
        System.exit(0);
    }
};

// setup DoubleBackPress behaviour : close the current Activity
DoubleBackPress doubleBackPress = new DoubleBackPress()
        .withDoublePressDuration(3000)     // msec - wait for second back press
        .withFirstBackPressAction(firstBackPressAction)
        .withDoubleBackPressAction(doubleBackPressAction);

Наконец, установите это как поведение при нажатии на спину.

@Override
public void onBackPressed() {
    doubleBackPress.onBackPressed();
}
1 голос
/ 01 июля 2015

отлично работает

@Override
public void onBackPressed() {
    if (mExitOnBackPress) finish();
    else {
        Toast.makeText(this, R.string.msg_confirm_exit, Toast.LENGTH_SHORT).show();
        mExitOnBackPress = true;
        new android.os.Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mExitOnBackPress = false;
            }
        }, 2000);
    }
}
0 голосов
/ 11 июня 2019

Чтобы отобразить диалоговое окно, подтверждающее, что пользователь желает выйти из действия Android.

Добавьте приведенный ниже код в метод переопределения onBackPressed.

@Override
        public void onBackPressed() {

                hideViews();
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);

                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("Are you sure you want to exit the activity?")
                        .setCancelable(false)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                                    finishAffinity();
                                }
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
                AlertDialog alert = builder.create();
                alert.show();

        }

Я надеюсь, что это поможет вам.

0 голосов
/ 26 декабря 2018

Если вы используете фрагмент вместо действия, включите этот код в основное занятие

    private Toast toast;
    private long lastBackPressTime = 0;
    @SuppressLint("WrongConstant")
    @Override
    public void onBackPressed() {
        int fragments = getFragmentManager().getBackStackEntryCount();
        if (fragments == 0) {
            // make layout invisible since last fragment will be removed
            if (this.lastBackPressTime < System.currentTimeMillis() - 3000) {
                toast = Toast.makeText(this, "Press back again to close this app", 3000);
                toast.show();
                this.lastBackPressTime = System.currentTimeMillis();

            }else{
                if (toast != null) {
                    toast.cancel();
                }
                super.onBackPressed();
            }

        }else{
            if (toast != null) {
                toast.cancel();
            }
            super.onBackPressed();
        }
    }
...