Androidアプリでのドラッグ可能なフローティングウィンドウ:レイアウト要素に焦点を当てていません

AnkeshクマールJaisansaria:

私のアプリケーションでは、私は、任意のアプリケーションやホーム画面の上部に表示され、フローティングタイプのウィンドウを作っています。Facebookのチャットの泡のよう。私は、さまざまなアクションのためのいくつかのボタンを持つフローティングウィンドウをドラッグ切妻を行いました。私は、ウィンドウ内のEditTextレイアウトを持っています。私は、フローティングウィンドウにフォーカスして、いくつかの問題を取得しています。すべてのレイアウトが非フォーカスで、エディットテキストも機能していません。

私は同じのscreenshootビデオを添付しています。

私のコードは次のとおりです -

サービス中のOnCreate関数(){}

    mFloatingWidget = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget, null);
    int layoutType;
    if(Build.VERSION.SDK_INT < 26) {
        layoutType = WindowManager.LayoutParams.TYPE_PHONE;
    } else {
        layoutType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    }


    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            layoutType,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.TOP | Gravity.START;
    params.x = 0;   // Initial Position of window
    params.y = 100; // Initial Position of window
    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    mWindowManager.addView(mFloatingWidget, params);


    mFloatingWidget.findViewById(R.id.root_container).setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d("AD","Action E" + event);
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Log.d("AD","Action Down");
                    initialX = params.x;
                    initialY = params.y;
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();
                    return true;
                case MotionEvent.ACTION_UP:
                    Log.d("AD","Action Up");
                    int Xdiff = (int) (event.getRawX() - initialTouchX);
                    int Ydiff = (int) (event.getRawY() - initialTouchY);
                    if (Xdiff < 10 && Ydiff < 10) {
                        if (isViewCollapsed()) {
                            collapsedView.setVisibility(View.GONE);
                            expandedView.setVisibility(View.VISIBLE);
                        }
                    }
                    return true;
                case MotionEvent.ACTION_MOVE:
                    Log.d("AD","Action Move");
                    params.x = initialX + (int) (event.getRawX() - initialTouchX);
                    params.y = initialY + (int) (event.getRawY() - initialTouchY);
                    mWindowManager.updateViewLayout(mFloatingWidget, params);
                    return true;
            }
            return false;
        }
    });


}

サンプル

私はコードで間違っているものを教えてください。

感謝

私のAgarwalさんのように:

このフォーカスが代わりにメイン画面のウィンドウ上で、ウィンドウマネージャに設定されていないので、これが起こって。paramsに0にセットFLAG_NOT_FOCUSを防ぐために。

更新されたコード: -

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            layoutType,
            0,   // I HAVE CHANGED THIS FROM NOT FOCUS TO ZERO
            PixelFormat.TRANSLUCENT);

params.gravity = Gravity.TOP | Gravity.START;
params.x = 0;   // Initial Position of window
params.y = 100; // Initial Position of window
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingWidget, params);

これはあなたのクエリに応答願っています。

感謝

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=330416&siteId=1