android - 无法在 TYPE_SYSTEM_ALERT 窗口中获得焦点并开始编辑 EditText

标签 android android-edittext overlay

我正在创建一个 float 的 EditText,它需要位于所有窗口的顶部。这是我正在使用的代码:

public class FlyingPaste extends Service {

    private WindowManager windowManager;
    private List<View> bubbles;
    private LayoutInflater inflater;
    private boolean isbubblexpanded;
    private ImageView bubble;
    private LinearLayout linearEditor;
    private LinearLayout linearBubble;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        inflater = LayoutInflater.from(this);
        bubbles = new ArrayList<View>();
        isbubblexpanded = false;
        Log.d("service","created");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        final View bubbleItem = inflater.inflate(R.layout.flying_paste, null);

        Log.d("service","onStartCommand");

        ImageView paste = (ImageView) bubbleItem.findViewById(R.id.flying_pasteit);
        final EditText pTxt = (EditText)bubbleItem.findViewById(R.id.flying_editText);
        pTxt.setFocusableInTouchMode(true);

        pTxt.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    return true;
                case MotionEvent.ACTION_UP:
                    pTxt.requestFocusFromTouch();
                    Log.d("Touch","got"); //HERE THE LOG MESSAGE IS SHOWN BUT NO SOFT KEYBOARD APPEAR xD
                    return true;
            }
                return false;
            }
        });

        ImageView minimize = (ImageView)bubbleItem.findViewById(R.id.flying_minimize);
        minimize.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                toggleBubble();
            }
        });

        bubble = (ImageView)bubbleItem.findViewById(R.id.flying_bubble);
        linearBubble = (LinearLayout)bubbleItem.findViewById(R.id.flying_bubbleLinearLayout);
        linearEditor = (LinearLayout)bubbleItem.findViewById(R.id.flying_linearEditor);

        bubbleItem.findViewById(R.id.flying_close).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                windowManager.removeView(bubbleItem);
            }
        });

        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.CENTER;

        bubbleItem.findViewById(R.id.flying_actbar).setOnTouchListener(new View.OnTouchListener() {
            private int initialX;
            private int initialY;
            private float initialTouchX;
            private float initialTouchY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        initialX = params.x;
                        initialY = params.y;
                        initialTouchX = event.getRawX();
                        initialTouchY = event.getRawY();
                        return true;
                    case MotionEvent.ACTION_UP:
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        params.x = initialX + (int) (event.getRawX() - initialTouchX);
                        params.y = initialY + (int) (event.getRawY() - initialTouchY);
                        windowManager.updateViewLayout(bubbleItem, params);
                        return true;
                }
                return false;
            }

        });

        bubble.setOnTouchListener(new View.OnTouchListener() {
            private int initialX;
            private int initialY;
            private float initialTouchX;
            private float initialTouchY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        initialX = params.x;
                        initialY = params.y;
                        initialTouchX = event.getRawX();
                        initialTouchY = event.getRawY();
                        return true;
                    case MotionEvent.ACTION_UP:
                        if (params.x > (initialX-5)) {
                            if (params.x < (initialX+5)) {
                                if (params.y > (initialY-5)) {
                                    if (params.y < (initialY+5)) {
                                        toggleBubble();
                                    }
                                }
                            }
                        }
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        params.x = initialX + (int) (event.getRawX() - initialTouchX);
                        params.y = initialY + (int) (event.getRawY() - initialTouchY);
                        windowManager.updateViewLayout(bubbleItem, params);
                        return true;
                }
                return false;
            }
        });

        bubble.setVisibility(View.VISIBLE);
        linearEditor.setVisibility(View.GONE);

        addBubbleItem(bubbleItem, params);

        return super.onStartCommand(intent, flags, startId);
    }

    public void addBubbleItem(View bubbleItem, LayoutParams params) {
        bubbles.add(bubbleItem);
        windowManager.addView(bubbleItem, params);
        Log.d("service","addBubbleItem");

    }

    public void toggleBubble() {
        if (isBubbleExpanded()) {
            linearEditor.setVisibility(View.GONE);
            linearBubble.setVisibility(View.VISIBLE);
            isbubblexpanded = false;
        }
        else {
            linearBubble.setVisibility(View.GONE);
            linearEditor.setVisibility(View.VISIBLE);
            isbubblexpanded = true;
        }
    }

    private boolean isBubbleExpanded() {
        return isbubblexpanded;
    }

    public void removeBubbleItem(View bubbleItem) {
        bubbles.remove(bubbleItem);
        windowManager.removeView(bubbleItem);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        for (View bubbleItem : bubbles) {
            removeBubbleItem(bubbleItem);
        }
    }
}

一切正常,除了当我单击 EditText(上面代码中的 pTxt)时,日志消息 Touch,got 是显示在控制台中,但 editText 未获得焦点,也未显示 软键盘。任何人都知道如何解决这个问题?提前致谢。

编辑: 我忘了说,如果我删除标志 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE EditText 将按预期工作,但软 后退按钮 则不起作用。

EDIT2:我需要更正自己,EditText 获得了焦点但 SoftInput 键盘没有显示

最佳答案

public static final int TYPE_SYSTEM_OVERLAY 窗口类型:系统覆盖窗口,需要显示在其他所有窗口之上。这些窗口不能获得输入焦点,否则它们会干扰键盘锁。在多用户系统中,仅在拥有用户的窗口中显示。

http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#TYPE_SYSTEM_OVERLAY

编辑:

经过几天的研究,我在 XDA 开发人员中找到了一个库,可以帮助我们完成任务。请引用链接.....它确实有效,并且他们提供了大量示例,这将帮助我们轻松理解库功能。

http://forum.xda-developers.com/showthread.php?t=1688531

关于android - 无法在 TYPE_SYSTEM_ALERT 窗口中获得焦点并开始编辑 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27488569/

相关文章:

iOS AwesomeMenu 委派和叠加

android - 如何在EditText中分割文本?

android - 单击EditText后隐藏键盘

android - 如何更改android Material 主题?

Javafx BorderPane 强制重叠

java - 将 EditText 中的文本向右移动

android - 当您的应用程序关闭且没有 firebase 时如何推送通知?

java - 不同屏幕尺寸的 Android 资源文件

android - Activity 栈

android - 在 ionic android 平台中放置插页式广告的正确方法