2

我有检查互联网是否连接的底页!如果未连接,则显示底页,如果未连接,则底页关闭。我使用bottomSheetDialog.dismiss();功能来防止用户按下屏幕来隐藏底页。现在我想要的是用户如果在底部显示退出应用程序时按下回

不要先退出bottocheet然后退出应用程序

这是我到目前为止所做的

我使用了一个名为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();
        }
    });
}

那么我该怎么做呢?

4

5 回答 5

2

下面的代码将按预期工作,我将与您分享我的代码片段。

在 MainActivity 我有下面的代码退出应用程序

   @Override
    public void onBackPressed() {
        super.onBackPressed();
    }

在片段内部,我有一个底页对话框。请注意我的 MainActivity 由片段组成

底页对话框的代码

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

如果您有疑问,请随时询问

于 2021-06-28T09:47:36.693 回答
2

默认情况下,当显示 a 时按下后退键时,不会调用BottomSheetDialog该活动。您可能可以尝试在其中放置一个断点并查看。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();

    }

};

更新:

当我尝试此代码时,我必须单击 tryAgain 按钮,然后我才能退出应用程序。但是当BottomSheet显示时它不会退出应用程序

因此,对话框显示早于BottomSheetFragment屏幕上显示的原因,因此,您需要在屏幕上显示时显示它BottomSheetFragment

所以这部分代码需要转入BottomSheetFragment onResume()方法:

@Override
public void onResume() {
    super.onResume();
    if (CheckNetwork.isInternetAvailable(requireActivity())) {
        bottomSheetDialog.dismiss();
    } else {
        bottomSheetDialog.show();
    }
}

你可以设置DialogFragment类似的onCreate()方法BottomSheetFragment

于 2021-06-28T03:56:55.500 回答
1

我不确定您的后台堆栈状态。它是显示底部工作表对话框的堆栈上的最后一个活动吗?如果是,那么您可以使用将调用finish()该活动的回调函数。如果不是,您可以使用参考说明

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

    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())
    
于 2021-07-01T01:36:44.757 回答
1

它不工作的原因是因为BottomSheetDialogDialog有它自己的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();
        }
    };
}
于 2021-07-02T04:21:50.583 回答
0

尝试使用此代码

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();
于 2021-06-22T05:21:58.500 回答