【问题标题】:How to capture keypress in View added by WindowManager如何在 WindowManager 添加的视图中捕获按键
【发布时间】:2012-02-06 09:21:16
【问题描述】:

我想为我的应用程序添加一个自定义视图。为此,我使用 WindowsManager:

        final WindowManager wm = getWindowManager();
        final View view = ((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.game_menu, null);
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND | WindowManager.LayoutParams.FLAG_FULLSCREEN;
        lp.dimAmount = (float) 0.6;
        lp.format = PixelFormat.TRANSPARENT;
        lp.windowAnimations = android.R.style.Animation_Dialog;
        view.setOnKeyListener(new OnKeyListener() 
        {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) 
            {
                Log.d("12", "12");
                if (keyCode == KeyEvent.KEYCODE_BACK)
                {
                    wm.removeView(view); // This I need to hide my menu
                }
                return false;
            }
        });
        wm.addView(view, lp); // I add menu like in Angry Birds and other games

但我无法捕获设备按键事件以隐藏此视图。

为什么在 WindowsManager 添加的视图中没有调用我的关键侦听器?我必须怎么做才能通过按下设备返回键来隐藏我的视图?

【问题讨论】:

    标签: android events view window key


    【解决方案1】:

    您可以在您的视图中添加这些setFocusableInTouchMode(true);

    【讨论】:

    • 在那之后我需要做些什么改变?
    • 我似乎无法专注于像 EditText 这样的其他东西?
    【解决方案2】:

    由于 android 安全政策,由 Windows 管理器添加的视图未收到 onKey 事件。

    【讨论】:

    • 我没有使用WindowManager添加视图,而是使用Relativelayout.addView();将菜单视图添加到活动。
    • @Nik 但我在服务中添加视图。如何处理?
    • @rup35h 我认为,由于安全限制,通过 WindowManager 添加的视图中无法监听键事件。否则任何应用程序都可以在任何应用程序中添加透明视图并监听用户输入!您可以使用透明背景启动 Activity 并在此 Activity 中执行任何操作。
    • 那么 facebook messenger 是如何让你在按下返回键时关闭弹出的 messenger 视图的呢?这是可能的,可能通过在添加到窗口管理器的视图中覆盖 dispatchKeyEvent 来实现。
    • @Eshaan 为什么你认为 facebook messenger 通过窗口管理器添加视图?它可以从活动或对话窗口中显示。但我没有使用 facebook messenger,我不能肯定。
    【解决方案3】:

    我在这方面还很陌生,但我正在尝试让类似的功能正常工作。这是它为我工作的原因(在 Kotlin 中):

    mOverlayView = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null)
    
    val params = WindowManager.LayoutParams(         
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
        // This was the piece I was missing
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 
            or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, 
        PixelFormat.TRANSLUCENT
    )
    
    mWindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    mWindowManager!!.addView(mOverlayView, params)
    
    mOverlayView!!.isFocusableInTouchMode = true
    mOverlayView!!.setOnKeyListener(object : View.OnKeyListener {
        override fun onKey(v: View?, keyCode: Int, event: KeyEvent?): Boolean {
            // Custom code here...
            return true
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多