如何在 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 引用

  1. 您可以使用以下代码退出 activity(但这不会终止同一应用程序中的底层活动。这只会最小化应用程序)

    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())
    

它不起作用的原因是 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();
        }
    };
}