如何禁用第二个底部 Sheet 对话框上的后退按钮?
How to disable Back button on second Bottom Sheet Dialog?
我正在创建 MainActivity。此 activity 有一个用于打开片段的按钮,片段有一个用于打开底部 sheet 对话框的按钮。
当我在 Fragment 上时,我可以按返回按钮 return 到 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() 。我不知道为什么。
由于您的 Bottom sheet 是 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
}
}
这将覆盖底部 sheet 片段的默认 onbackpress,因此,如果您将其添加到底部 sheet 片段并将其留空,则当您按下后退按钮时不会发生任何事情。
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return object : BottomSheetDialog(requireContext(), theme) {
override fun onBackPressed() {
// Handle backpress in here
}
}
}
我正在创建 MainActivity。此 activity 有一个用于打开片段的按钮,片段有一个用于打开底部 sheet 对话框的按钮。
当我在 Fragment 上时,我可以按返回按钮 return 到 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() 。我不知道为什么。
由于您的 Bottom sheet 是 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
}
}
这将覆盖底部 sheet 片段的默认 onbackpress,因此,如果您将其添加到底部 sheet 片段并将其留空,则当您按下后退按钮时不会发生任何事情。
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return object : BottomSheetDialog(requireContext(), theme) {
override fun onBackPressed() {
// Handle backpress in here
}
}
}