Как отключить кнопку «Назад» во втором диалоговом окне нижнего листа?

Я создаю MainActivity. В этом действии есть кнопка для открытия фрагмента, а во фрагменте есть кнопка для открытия диалогового окна нижнего листа.

Когда я нахожусь на фрагменте, я могу нажать кнопку «Назад», чтобы вернуться в MainActivity. Однако, когда я уже открыл нижнее диалоговое окно, я хочу отключить кнопку «Назад», чтобы пользователь не мог нажимать кнопку «Назад», когда отображается нижнее диалоговое окно. Так как я могу это сделать? Спасибо.

Основная деятельность

public class MainActivity extends SdwBaseActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void startAction(View view){
    LoadCashTutorialScreen loadCashTutorialScreen = LoadCashTutorialScreen.newInstance();
 getSupportFragmentManager().beginTransaction().replace(R.id.container, loadCashTutorialScreen, "LoadCashTutorialScreen").addToBackStack("LoadCashTutorialScreen").commit();
}

@Override
public void onBackPressed(){
      super.onBackPressed()
      //do something so that the back button is disable when the Bottom Dialog is showing
}
}

Фрагмент:

public class LoadCashTutorialScreen extends Fragment{
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = initView(inflater, container, R.layout.load_cash_tutorial_screen);
        Button startDialog = view.findViewById(R.id.dialogButton);
        startDialog.setOnClickListener(view1 -> {
            MyBottomDialog dialog = new MyBottomDialog();
            dialog.show(activity.getSupportFragmentManager(), "BottomDialog");
        });

        return view;
    }
}

Диалог:

public class MyBottomDialog extends BottomSheetDialogFragment {
    @Override
    public void setupDialog(@NonNull Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View contentView = View.inflate(getContext(), R.layout.load_cash_bottom_dialog, null);
        dialog.setContentView(contentView);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
    }
}

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


person Vyolet    schedule 05.02.2020    source источник


Ответы (2)


Поскольку ваш Нижний лист - это Fragment, вы должны слушать его по-разному. Использовать это:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    // ...
    setupBackPressListener()
}

private fun setupBackPressListener() {
    this.view?.isFocusableInTouchMode = true
    this.view?.requestFocus()
    this.view?.setOnKeyListener { _, keyCode, _ ->
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            // Do what you want to do on back press
            true
        } else
            false
    }
}
person omz1990    schedule 05.02.2020
comment
Рад, что помог! - person omz1990; 05.02.2020

Это отменит обратное нажатие по умолчанию фрагмента нижнего листа. Итак, если вы добавите это к фрагменту нижнего листа и оставите его пустым, при нажатии кнопки возврата ничего не произойдет.

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return object : BottomSheetDialog(requireContext(), theme) {
        override fun onBackPressed() {
            // Handle backpress in here
        }
    }
}
person UltraDCR    schedule 08.11.2020
comment
Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и качественнее, и с большей вероятностью соберут положительные голоса. - person Mark Rotteveel; 08.11.2020