首页 > 解决方案 > 如何禁用第二个底页对话框上的后退按钮?

问题描述

我正在创建一个 MainActivity。此活动有一个打开片段的按钮,片段有一个打开底部工作表对话框的按钮。

当我在 Fragment 上时,我可以按 Back 按钮返回 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() 上写了一些方法来防止对话框消失,但是,当按下 Back 时对话框总是消失。调试后,我意识到显示底部对话框时未达到 onBackPressed() 。我不知道为什么。

标签: androidbottom-sheet

解决方案


由于您的底部表是 a 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
    }
}

推荐阅读