Как выйти из приложения, когда отображается диалоговое окно нижнего листа

У меня есть нижний лист, который проверяет, подключен ли интернет или нет! если нет подключенного нижнего листа, отображается, если нет нижнего листа, уберите. Я использовал функцию bottomSheetDialog.dismiss();, чтобы пользователь не нажимал на экран, чтобы скрыть нижний лист. Теперь я хочу, чтобы пользователь если нажимал назад, когда нижний лист показывался, выходил из приложения.

не выходить из нижней части сначала, а затем выйти из приложения

Вот что я сделал до сих пор

Я использовал интерфейс под названием IOnBackPressed и переопределяю выходное приложение из MainActivty с помощью этого кода.

 @Override
public void onBackPressed() {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_layout);
    if (!(fragment instanceof IOnBackPressed)) {
        super.onBackPressed();
    }
}

И я добавил метод выхода приложения во фрагмент, который имеет нижний лист HomeFragment.

 @Override
public boolean onBackPressed() {
    bottomSheetDialog.dismiss();
    requireActivity().moveTaskToBack(true); //exit the app when press back
    requireActivity().finish();
    return true;
}

Но это не работает, и когда я нажимаю назад, приложение не закрывается.

Вот мой метод для нижнего листа

    private void showBottomSheetDialog() {
    bottomSheetDialog = new BottomSheetDialog(requireContext());
    bottomSheetDialog.setContentView(R.layout.bottomsheet_no_internet);
    if (CheckNetwork.isInternetAvailable(requireActivity())) {
        bottomSheetDialog.dismiss();
    } else {
        bottomSheetDialog.setCancelable(false);
        bottomSheetDialog.show();
    }
    Button buttonNoInternet = bottomSheetDialog.findViewById(R.id.buttonNoInternet);
    assert buttonNoInternet != null;
    buttonNoInternet.setOnClickListener(v -> {
        if (CheckNetwork.isInternetAvailable(requireActivity())) {
            adapter.notifyDataSetChanged();
            bottomSheetDialog.dismiss();
        } else {
            bottomSheetDialog.dismiss();
            adapter.notifyDataSetChanged();
            bottomSheetDialog.show();
        }
    });
}

Итак, как я могу это сделать?


person Moataz    schedule 22.06.2021    source источник
comment
когда я нажимаю «назад», приложение не выходит. Что происходит, когда вы нажимаете кнопку «Назад»? вызывает ли он bottomSheetDialog.dismiss()? @Моатаз   -  person androidLearner    schedule 28.06.2021


Ответы (5)


По умолчанию, когда клавиша «Назад» нажата во время отображения BottomSheetDialog, действие onBackPressed() не будет вызываться. Вероятно, вы можете попробовать поставить точку останова внутри onBackPressed() и посмотреть.

Таким образом, обходной путь, отличный от onBackPressed(), заключается в том, чтобы прикрепить прослушиватель ключей к BottomSheetDialog и проверить код нажатой клавиши, который соответствует обратному коду; и там вы можете закрыть диалог и выйти из приложения:

bottomSheetDialog = new BottomSheetDialog(requireContext()) {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                    // Back key is pressed

                    bottomSheetDialog.dismiss(); // Optional
                    requireActivity().moveTaskToBack(true); //exit the app when press back
                    requireActivity().finish();
                    return true;
                }
                return false;
            }
        });

        Button buttonNoInternet = findViewById(R.id.buttonNoInternet);
        buttonNoInternet.requestFocus();

    }

};

ОБНОВЛЕНИЕ:

Когда я пробую этот код, я ДОЛЖЕН нажать кнопку tryAgain, после чего я могу выйти из приложения. Но это не выход из приложения, когда показан BottomSheet

Итак, причина, по которой диалог отображается раньше, чем BottomSheetFragment, отображается на экране, поэтому вам нужно показать его, когда на экране отображается BottomSheetFragment:

Поэтому эту часть кода нужно перенести в метод BottomSheetFragment onResume():

@Override
public void onResume() {
    super.onResume();
    if (CheckNetwork.isInternetAvailable(requireActivity())) {
        bottomSheetDialog.dismiss();
    } else {
        bottomSheetDialog.show();
    }
}

И вы можете просто настроить DialogFragment, как указано в методе onCreate() метода BottomSheetFragment.

person Zain    schedule 28.06.2021
comment
Когда я пробую этот код, я ДОЛЖЕН нажать кнопку tryAgain, после чего я могу выйти из приложения. Но это не выход из приложения, когда показан BottomSheet - person Moataz; 02.07.2021
comment
@Moataz Можете ли вы показать эту часть кода .. Я не вижу кнопку tryAgain в вопросе - person Zain; 02.07.2021
comment
Проверьте коды в моем фрагменте. github.com/MoatazBadawy/MOX/blob/master/app/src/main/java/com/ - person Moataz; 02.07.2021
comment
@Moataz Можешь попробовать это: @Override public void onResume() { super.onResume(); Button buttonNoInternet = bottomSheetDialog.findViewById(R.id.buttonNoInternet); buttonNoInternet.requestFocus(); } - person Zain; 02.07.2021
comment
Отлично, я использую его, но получая эту ошибку, метод PatchStore::createDisableExceptionQarthFile не работает. - person Moataz; 02.07.2021
comment
И без добавления assert buttonNoInternet != null;, получая эту ошибку boolean android.widget.Button.requestFocus()' для нулевой ссылки на объект - person Moataz; 02.07.2021
comment
Вы правы, потому что это часть фрагмента. Я хотел использовать его в нижнем листе диалога. Пожалуйста, проверьте обновленный ответ. - person Zain; 02.07.2021
comment
@Moataz Любые хорошие новости, или мы можем придумать что-нибудь еще - person Zain; 02.07.2021
comment
Я очень ценю ваши усилия, но также не работает. мы могли бы поболтать? - person Moataz; 02.07.2021
comment
Давайте продолжим обсуждение в чате. - person Zain; 02.07.2021

Код ниже будет работать, как и ожидалось, я поделюсь с вами своим фрагментом кода.

Внутри MainActivity у меня есть код для выхода из приложения

   @Override
    public void onBackPressed() {
        super.onBackPressed();
    }

Внутри фрагмента у меня есть диалог нижнего листа. Обратите внимание, что моя MainActivity состоит из фрагмента

Код для нижнего диалогового окна

private void openDialogCategoryList() {

        BottomSheetDialog dialog = new BottomSheetDialog(mActivity, R.style.DialogStyle);
        BottomSheetDialogLayoutCountryCodeBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mActivity),
                R.layout.bottom_sheet_dialog_layout_country_code, null, false);
        dialog.setContentView(binding.getRoot());
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.getWindow().findViewById(R.id.design_bottom_sheet).setBackgroundResource(android.R.color.transparent);


        dialog.setCancelable(false);

        dialog.setOnKeyListener(new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface arg0, int keyCode,
                                 KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    getActivity().onBackPressed();
                }
                return true;
            }
        });

        dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialogInterface) {
                countProductType = 0;
            }
        });

        binding.txtTitle.setText("Select Product Type");
        binding.edtSearch.setHint("Search Product Type");

      
        binding.txtClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                dialog.dismiss();
            }
        });

        binding.flOpenClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();
    }

Не стесняйтесь спрашивать, если у вас есть сомнения

person riddhee    schedule 28.06.2021
comment
пробую, тоже не работает - person Moataz; 02.07.2021
comment
не могли бы вы поделиться своим кодом, чтобы я мог помочь вам, так как это сработало для меня... - person riddhee; 05.07.2021

Я не уверен в вашем состоянии обратного стека. Это последнее действие в этом стеке, которое показывает диалоговое окно нижнего листа? Если это так, вы можете использовать функцию обратного вызова, которая вызовет finish() для этого действия. Если это не так, вы можете использовать эту ссылку, в которой говорится

  1. Вы можете выйти из действия, используя следующий код (но это не убьет базовые действия в том же приложении. Это просто свернет приложение)

    var intent = new Intent(Intent.ActionMain);
    intent.AddCategory(Intent.CategoryHome);
    intent.SetFlags(ActivityFlags.NewTask);
    startActivity(intent);
    finish();
    
  2. Убить процесс

    android.os.Process.killProcess(android.os.Process.myPid())
    
person Eishon    schedule 01.07.2021
comment
Я использую Java, а не Котлин - person Moataz; 02.07.2021

Причина, по которой это не работает, заключается в том, что BottomSheetDialog является Dialog, у которого есть собственный onBackPressed(). Вам нужно переопределить следующее в вашем BottomSheetDialog:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(getActivity(), getTheme()){
        @Override
        public void onBackPressed() {
            // Maybe check before if there still no connection
            requireActivity().moveTaskToBack(true);
            requireActivity().finish();
        }
    };
}
person Yosef    schedule 02.07.2021
comment
Не работает..... - person Moataz; 02.07.2021

Попробуйте с этим кодом

Intent i = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

or

System.exit(0);

or

finishAffinity();
finish();
person Ajithkumar Muthukumaran    schedule 22.06.2021
comment
В onBackPressed что внутри TopFragment? - person Moataz; 22.06.2021
comment
да! с в onBackPressed - person Ajithkumar Muthukumaran; 22.06.2021
comment
К сожалению тоже не работает - person Moataz; 22.06.2021
comment
Все вышеперечисленное не работает? - person Ajithkumar Muthukumaran; 22.06.2021
comment
Да, я пробовал их все, не работает - person Moataz; 22.06.2021