如何在windowmanager视图中获得焦点

时间:2014-11-27 09:03:29

标签: android view window-managers

我使用WindowManager创建一个视图并将视图添加到屏幕,但我无法使视图具有焦点。我认为我将WindowManager.LayoutParams设置为正确。

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main);
    pushView = LayoutInflater.from(getApplicationContext()).inflate(
            R.layout.push, null);

    btn = (Button) findViewById(R.id.btn);
    cancelBtn = (Button) pushView.findViewById(R.id.cancelBtn);
    windowManager = getWindowManager();
    handler = new MyHandler();

    pushView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            System.out.println("onclick");
            windowManager.removeView(pushView);
        }
    });


    btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT, 
                    WindowManager.LayoutParams.WRAP_CONTENT, 
                    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 
                    WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                    PixelFormat.TRANSLUCENT);
            params.gravity = Gravity.TOP | Gravity.LEFT;
            params.y = 0;
            params.x = 0;

            windowManager.addView(pushView, params);

            new Timer().schedule(new TimerTask() {

                @Override
                public void run() {
                    Message msg = handler.obtainMessage();
                    handler.sendEmptyMessage(0x123);
                }
            }, 5000);

        }
    });

}

我想让pushView专注于处理观看事件。这个问题困扰了我很长一段时间。谁能帮助我...

3 个答案:

答案 0 :(得分:1)

您只需删除FLAG_NOT_FOCUSABLE标记:

params.flags = params.flags & ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

答案 1 :(得分:0)

我已经找到了问题。因为我使用了TYPE_SYSTEM_OVERLAY。 窗口类型:系统覆盖窗口,需要显示在其他所有窗口之上。这些窗口不得占用输入焦点,否则会干扰键盘锁。在多用户系统中,仅在拥有用户的窗口中显示。

所以我无法获得输入焦点。

答案 2 :(得分:0)

这可能已经晚了4年但您尝试使用WindowManager.LayoutParams.TYPE_SYSTEM_ALERT代替TYPE_SYSTEM_OVERLAY

前者似乎没有焦点剥夺限制