【问题标题】:How to exit the app when bottomsheetdialog showing显示bottomsheetdialog时如何退出应用程序
【发布时间】:2021-09-05 16:50:42
【问题描述】:

我有检查互联网是否连接的底页!如果未连接,则显示底页,如果未连接,则底页关闭。我使用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();
        }
    });
}

那我该怎么做呢?

【问题讨论】:

  • “当我按下返回时它不会退出应用程序”->当你按下返回按钮时会发生什么?它是否调用 bottomSheetDialog.dismiss()? @Moataz
  • public boolean onBackPressed(){ ... return super.onBackPressed();}

标签: java android kotlin onbackpressed android-bottomsheetdialog


【解决方案1】:

默认情况下,当显示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时显示它:

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

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

你可以像BottomSheetFragmentonCreate()方法中所说的那样设置DialogFragment

【讨论】:

  • 当我尝试此代码时,我必须单击 tryAgain 按钮,然后我才能退出应用程序。但是当BottomSheet显示时它不会退出应用程序
  • @Moataz 你能显示这部分代码吗.. 我看不到问题中的tryAgain 按钮
  • @Moataz 你能试试这个吗:@Override public void onResume() { super.onResume(); Button buttonNoInternet = bottomSheetDialog.findViewById(R.id.buttonNoInternet); buttonNoInternet.requestFocus(); }
  • @Moataz 有什么好消息,或者我们可以想别的办法
【解决方案2】:

以下代码将按预期工作,我将与您分享我的代码 sn-p。

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

如有疑问,请随时询问

【讨论】:

  • 您能否分享您的代码,以便我可以帮助您,因为它对我有用...
【解决方案3】:

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

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

【讨论】:

  • 我使用 Java 而不是 kotlin
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    试试这个代码

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

    【讨论】:

    • 在 onBackPressed 里面的 TopFragment?
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2021-01-20
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多