【问题标题】:onBackPressed() does not workonBackPressed() 不起作用
【发布时间】:2014-02-11 09:29:20
【问题描述】:

我在应用启动时显示了一个对话框,您必须在其中选择一个配置。由于选择一个配置很重要,我想通过一个空的onBackPressed()“禁用”后退按钮。

我在DialogFragment 中得到了以下代码:

 public class ChangeConfigDialogFragment extends DialogFragment {

    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.dialog_config_change)
                .setItems(R.array.config_array,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                // The 'which' argument contains the index
                                // position
                                // of the selected item
                                if (which == 0){
                                    Initiation.BAUDRATE = 500;
                                    Toast.makeText(getActivity(), "Baudrate at " + Initiation.BAUDRATE, Toast.LENGTH_LONG).show();
                                    if (Initiation.getADK() == null){
                                        Initiation.initiateCAN();
                                    }
                                } else if (which == 1) {
                                    Initiation.BAUDRATE = 600;
                                    Toast.makeText(getActivity(), "Baudrate at " + Initiation.BAUDRATE, Toast.LENGTH_LONG).show();
                                    if (Initiation.getADK() == null){
                                        Initiation.initiateCAN();
                                    }
                                } else if (which == 2) {
                                    Initiation.BAUDRATE = 700;
                                    Toast.makeText(getActivity(), "Baudrate at " + Initiation.BAUDRATE, Toast.LENGTH_LONG).show();
                                    if (Initiation.getADK() == null){
                                        Initiation.initiateCAN();
                                    }
                                }

                            }

                        });
        // Create the AlertDialog object and return it
        return builder.create();
    }

    public void onBackPressed(){
        Log.d(getTag(), "are you there?");

    }
}

问题是,onBackPressed() 从未被调用过。连日志消息都没有出现。

我试图清理项目,但没有成功。还尝试在 SO 上使用来自其他一些主题的 onKeyDown 方法。有谁知道如何解决这个问题?

编辑:

现在可以了。 .setCancelable(false); 有效,但我愚蠢地将其添加到调用 FragmentDialog 中。 (而是将其添加到builder

感谢您的所有帮助和时间。

【问题讨论】:

  • onBackPressed() 是一个活动,而不是片段方法 - 你没有覆盖任何东西。你想通过覆盖它来实现什么?
  • 设置一个 KeyListener 怎么样?
  • 我试过了,因为在另一个应用程序中它可以工作。所以我只是复制了onBackPressed()的代码并认为它​​可以工作,因为它没有我开始搜索答案
  • 您不能检查开发人员文档所说的内容,而不是寻找答案吗?
  • 据我了解,DialogFragment 无法处理onBackPressed(),因为它是一个 Activity 方法。所以我必须处理我的活动的onBackPressed()。在开发人员文档中我找不到它,所以如果对话框是“活动的”,是否可以从我的Activity 内部检查?

标签: android dialog fragment back-button


【解决方案1】:

从你的问题看来,当你的对话框打开时,你不需要关闭对话框,直到用户可以从对话框中选择任何 1 打开,如果我没有错的话,所以为此你不需要禁用后退键,但你必须为对话框设置这两个属性。

dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);

如果您想禁用返回键,请使用以下代码,

@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {
 //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
 return true;
 }
 return super.onKeyDown(keyCode, event);    }

OnbackkeyPressed 需要 Api 5 级或更高级别。

@Override
public void onBackPressed() {
}

【讨论】:

  • setCancelable(false); 不会禁用 BackButton 功能。 KeyDown 不起作用,因为它没有为 DialogFragment 和 onBackPressed 定义也导致它的一个 Activity 方法
  • 你只需要为你的对话框设置这个属性 dialog.setCanceledOnTouchOutside(false); & 要禁用后退按钮,请检查此链接 stackoverflow.com/questions/4779954/…
  • 我无法创建 AlertDialog 对象,因为构造函数不可见 :(
  • 你是对的@i.n.e.f,我只是愚蠢地将它附加到对话框:(
【解决方案2】:

【讨论】:

  • @RajeshCP 我想是的,尤其是他的要求
  • 但我仍然可以按 BackButton 并且对话框消失。这就是我试图阻止的
  • @Fraggles 你在哪里返回对话框?如果您删除 onBackPressed 并在 create() 之前添加 .setCancelable(false); ,它有效
  • 对话框通过return builder.create();返回
  • 所以不是builder.setCancelable(false),而是dialog.setCancelable(false)
【解决方案3】:

我没有尝试这个,但如果你像这样在构建器上设置OnKeyListener,它可能会起作用:

builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            return false;
        }
    }
});

【讨论】:

    【解决方案4】:

    试试

    public boolean onKeyDown(int keyCode, KeyEvent event) {
            // Handle the back button
    
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                         return false;
            }
            return super.onKeyDown(keyCode, event);
        }
    

    dialog.setCancelable(false);
    

    【讨论】:

    • 您是否正确阅读了他指定的问题“我想通过一个空的 onBackPressed() 来“禁用”后退按钮”
    • 我还写过我用onKeyDown-method尝试过
    • 方法.onKeyDown在DialogFragment中未定义
    • @Fraggles 用这个 AlertDialog.Builder 尝试你的代码 builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.dialog_config_change).setCancelable(false) .setItems(R.array.config_array, new DialogInterface.OnClickListener() {
    • 所以不是builder.setCancelable(false),而是dialog.setCancelable(false)
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多