【问题标题】:how to listen key when popup is opened打开弹出窗口时如何监听键
【发布时间】:2013-04-23 05:52:19
【问题描述】:

我正在编写一个应用程序来动画弹出窗口。它与我的代码配合得很好。

我想在设备上按下后退按钮时关闭弹出窗口(即向下滑动)。

但我无法从设备中听到任何一个键。我使用了那个弹出窗口的setOnKeyListener,我什至没有从中获取日志。

我的代码如下:

popup_layout = layoutInflater.inflate(R.layout.popup_addchannel, null);
            popupWindow = new PopupWindow(popup_layout, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
subscribeButton.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {

//                  Log.d(TAG,
//                          "Button is clicked for animation....  Visibility is"
//                                  + subscribeButton.getVisibility());
                    openMenu(view);
                }
            });
popup_layout.setOnKeyListener(new View.OnKeyListener() {

                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    Log.d(TAG, "on key button click called.........");
                    return false;
                }

            });

public void openMenu(View view) {
        if (!flag) {
            popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);
            popupWindow.showAtLocation(view.findViewById(R.id.button1),
                    Gravity.CENTER, 0, 0);
            popupWindow.setFocusable(true);
            popupWindow.update();
            flag = true;
        } else {
            popupWindow.dismiss();
            popupWindow.setFocusable(false);
            flag = false;
        }
    }

这背后的问题是什么?

我能达到我的要求吗?

请指导我。

提前感谢您!

【问题讨论】:

    标签: android back-button keylistener popupwindow


    【解决方案1】:

    试试这个....

        final PopupWindow popupWindow = new PopupWindow(popupView,
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,true);
        ...
        popupWindow.getContentView().setFocusableInTouchMode(true);
        popupMenu.getContentView().setOnKeyListener(new View.OnKeyListener() {        
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode ==  KeyEvent.KEYCODE_MENU && 
                        event.getRepeatCount() == 0 && 
                        event.getAction() == KeyEvent.ACTION_DOWN) {
                    // ... payload action here. e.g. popupMenu.dismiss();
                    return true;
                }                
                return false;
            }
        });
    

    【讨论】:

    • 设置后"popupWindow.getContentView().setFocusableInTouchMode(true);"这个,它工作正常...谢谢您的回复。
    • 打扰一下先生,我有一个问题:
    • 在编辑文本时,如果我们按下返回键,键盘会关闭。如果我想在编辑文本后向下滑动该弹出窗口,则该后退按钮不起作用。请帮我解决这个问题。
    • 我找到了答案。编辑后仅 EditText 将成为焦点。因此,我们需要为 EditText 设置“setOnKeyListener”。因为我们必须检查按下的后退键为“keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN”..
    • 以上方法不起作用。监听器没有注册有什么原因吗?请帮忙
    【解决方案2】:

    该对话框具有在按下后取消对话框的属性。

    dialog.setCancelable(true);
    

    编辑:在此链接上查看 Qberticus 答案:Android popup window dismissal

    你也可以看到:Issue dismissing popup window

    【讨论】:

    • 但我使用的是popupWindow na?它没有这个属性。当我按下后退按钮时,我该如何关闭它?
    • 在编辑文本时,如果我们按下返回键,键盘会关闭。如果我想在编辑文本后向下滑动该弹出窗口,则该后退按钮不起作用。请帮我解决这个问题。
    【解决方案3】:

    是的,您可以使用它 dialog_obj.setCancelable(true);

    【讨论】:

      【解决方案4】:

      您应该重写您的活动的 onKeyPressed() 方法,如下所示。

      @Override
      public void onBackPressed() {
         super.onBackPressed();
         //your code to close the popup window.
         popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);
         popupWindow.showAtLocation(view.findViewById(R.id.button1),
                  Gravity.CENTER, 0, 0);
         opupWindow.setFocusable(true);
         popupWindow.update();
         flag = true;
      }
      

      【讨论】:

      • 感谢您的快速回复...我已经在此活动中将 onBackPressed 用于其他目的。
      • 抱歉最后一条评论中的信息有误。这个类是从片段扩展而来的。所以我无法覆盖其中的 onBackPressed。我在其他活动中使用了 onBackPressed。对不起..
      • 那么,你可以把这段代码放在FragmentActivity类的onBackPressed()中..对吧?
      • 我不能......这就是问题所在......然后只有我决定在这个片段类中使用 setOnKeyListener..
      • 在编辑文本时,如果我们按下返回键,键盘会关闭。如果我想在编辑文本后向下滑动该弹出窗口,则该后退按钮不起作用。请帮我解决这个问题。
      【解决方案5】:
      popupWindow.getContentView().setOnClickListener(new OnClickListener()) {
      
          @Override
          public void onClick(View v) {
              // TODO Auto-generated method stub
              popupWindow.dismiss();
          }
      });
      

      试试这个。

      【讨论】:

        【解决方案6】:

        在弹窗中不能监听按键,但是在监听系统返回键时,可以重写dismiss()方法来拦截。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-26
          • 2013-05-14
          • 1970-01-01
          相关资源
          最近更新 更多