如何在 bottomsheetdialog 显示时退出应用程序
How to exit the app when bottomsheetdialog showing
我有底纸可以检查互联网是否连接!如果没有连接底片显示,如果没有底片关闭。我使用了 bottomSheetDialog.dismiss();
函数来防止用户按下屏幕来隐藏 bottomsheet。现在我想要的是用户 如果在 bottomsheet 显示退出应用程序时按回键 .
not exit bottocheet first and then exit the app
这是我到目前为止所做的
我使用了一个名为 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;
}
但是它不起作用,当我按下返回时它没有退出应用程序。
这是我的 bottomsheetdialog 方法
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();
}
});
}
那我该怎么做呢?
尝试使用此代码
Intent i = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
或
System.exit(0);
或
finishAffinity();
finish();
默认情况下,当显示 BottomSheetDialog
时按下后退键,activity 的 onBackPressed()
不会被调用。您可能可以尝试休息一下指向 onBackPressed()
里面看看。
因此,onBackPressed()
以外的解决方法是将 Key 侦听器附加到 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();
}
};
更新:
When I try this code I MUST click on tryAgain Button and then I can exit the app. But it is not exit the app when BottomSheet showen
因此,对话框显示早于 BottomSheetFragment
显示在屏幕上的原因,因此,您需要在屏幕上显示 BottomSheetFragment
时显示它:
所以这部分代码需要转BottomSheetFragment
onResume()
方法:
@Override
public void onResume() {
super.onResume();
if (CheckNetwork.isInternetAvailable(requireActivity())) {
bottomSheetDialog.dismiss();
} else {
bottomSheetDialog.show();
}
}
您可以像 BottomSheetFragment
的 onCreate()
方法中所说的那样设置 DialogFragment
下面的代码将按预期运行,我将与您分享我的代码片段。
在 MainActivity 中,我有以下退出应用程序的代码
@Override
public void onBackPressed() {
super.onBackPressed();
}
内部片段我有一个底页对话框。请注意我的 MainActivity 由 fragment
组成
底页对话框的代码
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();
}
有疑问欢迎提问
我不确定您的返回堆栈状态。显示底部 Sheet 对话框的是堆栈中的最后一个 Activity 吗?如果是,那么您可以使用一个回调函数,该函数将在 activity 上调用 finish()
。如果不是,您可以使用 this 引用
您可以使用以下代码退出 activity(但这不会终止同一应用程序中的底层活动。这只会最小化应用程序)
var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();
正在终止进程
android.os.Process.killProcess(android.os.Process.myPid())
它不起作用的原因是 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();
}
};
}
我有底纸可以检查互联网是否连接!如果没有连接底片显示,如果没有底片关闭。我使用了 bottomSheetDialog.dismiss();
函数来防止用户按下屏幕来隐藏 bottomsheet。现在我想要的是用户 如果在 bottomsheet 显示退出应用程序时按回键 .
not exit bottocheet first and then exit the app
这是我到目前为止所做的
我使用了一个名为 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;
}
但是它不起作用,当我按下返回时它没有退出应用程序。
这是我的 bottomsheetdialog 方法
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();
}
});
}
那我该怎么做呢?
尝试使用此代码
Intent i = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
或
System.exit(0);
或
finishAffinity();
finish();
默认情况下,当显示 BottomSheetDialog
时按下后退键,activity 的 onBackPressed()
不会被调用。您可能可以尝试休息一下指向 onBackPressed()
里面看看。
因此,onBackPressed()
以外的解决方法是将 Key 侦听器附加到 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();
}
};
更新:
When I try this code I MUST click on tryAgain Button and then I can exit the app. But it is not exit the app when BottomSheet showen
因此,对话框显示早于 BottomSheetFragment
显示在屏幕上的原因,因此,您需要在屏幕上显示 BottomSheetFragment
时显示它:
所以这部分代码需要转BottomSheetFragment
onResume()
方法:
@Override
public void onResume() {
super.onResume();
if (CheckNetwork.isInternetAvailable(requireActivity())) {
bottomSheetDialog.dismiss();
} else {
bottomSheetDialog.show();
}
}
您可以像 BottomSheetFragment
onCreate()
方法中所说的那样设置 DialogFragment
下面的代码将按预期运行,我将与您分享我的代码片段。
在 MainActivity 中,我有以下退出应用程序的代码
@Override
public void onBackPressed() {
super.onBackPressed();
}
内部片段我有一个底页对话框。请注意我的 MainActivity 由 fragment
组成底页对话框的代码
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();
}
有疑问欢迎提问
我不确定您的返回堆栈状态。显示底部 Sheet 对话框的是堆栈中的最后一个 Activity 吗?如果是,那么您可以使用一个回调函数,该函数将在 activity 上调用 finish()
。如果不是,您可以使用 this 引用
您可以使用以下代码退出 activity(但这不会终止同一应用程序中的底层活动。这只会最小化应用程序)
var intent = new Intent(Intent.ActionMain); intent.AddCategory(Intent.CategoryHome); intent.SetFlags(ActivityFlags.NewTask); startActivity(intent); finish();
正在终止进程
android.os.Process.killProcess(android.os.Process.myPid())
它不起作用的原因是 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();
}
};
}