Пользовательское поведение кнопки «Назад» во фрагменте с использованием графика навигации - PullRequest
0 голосов
/ 18 февраля 2019

Я пишу игру, в которой один фрагмент загружается несколько раз подряд с увеличением числа элементов на экране, так что сложность увеличивается.Я делаю это с навигационным графом, в котором уровень имеет действие для себя, в котором он каждый раз передает новые параметры.Пока все хорошо.

Единственная проблема - BackStack: если я сохраняю поведение по умолчанию, он возвращается к тому же фрагменту, но с некоторыми странными изменениями в числах оценок.Если я настрою его на возврат прямо в главное меню, пользователь может по ошибке нажать кнопку «Назад» и потерять свой прогресс.

Поэтому я хочу отобразить диалоговое окно с предупреждением, предлагающее принять решение возобновить игру или вернуться в главное меню.

Я знаю, как создать диалоговое окно, но как его отобразить, когда вернулосьнажата?Попытка переопределить onBackPressed(), onNavigateUp() и onSupportNavigateup() каждый дает мне сообщение "ничего не переопределяет".Что еще я мог попробовать?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я использовал следующий код в своей основной деятельности:

override fun onBackPressed() {
    val navController = Navigation.findNavController(this, R.id.fragment5)
    println(navController.currentDestination?.label)
    if(navController.currentDestination?.label.toString() == "ChromaticFragment"){
        val dialogBuilder = AlertDialog.Builder(this)

        dialogBuilder.setMessage("What do you want to do?")

            .setNeutralButton("Resume Level") { dialog, _ ->
                dialog.dismiss()
            }
            .setPositiveButton("Play next level") { _, _ ->
                FullscreenActivity.level.levelSelection(FullscreenActivity.makeLevel.nextlevelsetup)
                navController.navigate(R.id.action_chromaticFragment_self)
            }
            .setNegativeButton("Exit to Main Menu") { _, _ ->
                navController.popBackStack(R.id.mainFragment, true)
                navController.navigate(R.id.action_global_mainFragment)
            }

        val alert = dialogBuilder.create()
        alert.show()
    }
    else {
        super.onBackPressed()
    }
}
0 голосов
/ 18 февраля 2019

Предполагая, что у вас есть следующий код в Деятельности, чтобы показать фрагменты:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction t = fm.beginTransaction();
t.replace(R.id.test, MyFragment.newInstance(), null);
t.addToBackStack(null);
t.commit();

Вы можете переопределить onBackPressed() в Деятельности, например:

@Override
public void onBackPressed() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // ...
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            MyActivity.super.onBackPressed();
        }
    });
    builder.setNegativeButton("Cancel", null);
    builder.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...