4

ボタン(上)に固定されたPopupWindowがあります。PopupWindow には ScrollView が含まれています。PopupWindow は SOFT_INPUT_ADJUST_RESIZE モードで、オフセットで配置されています

コード :

    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    window.showAtLocation(parent, Gravity.NO_GRAVITY, xPos, yPos);

画面:

ベース画面 http://imageshack.us/a/img38/7771/basescreen.png

ソフト キーボードが表示されると、次のようになります (一番上のボタンは非表示になっています)。

私が持っている画面 http://imageshack.us/a/img21/6396/whatihavescreen.png

そして、私はしたいと思います:

PopupWindow は Button に固定され、サイズも変更されます。

私が持っている画面 http://imageshack.us/a/img805/3302/whatiwantscreen.png

前もって感謝します !

4

2 に答える 2

0

自分の努力...それは私が開発した最善の解決策ではありませんが、とにかく...うまくいきます...

パート 1 : SoftKeyboard が表示されたときに PopupWindow のサイズを変更する

  • コンテンツ ビューで OnGlobalLayoutListener を使用する

    contentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    
        int baseHeight = 0;
    
        @Override
        public void onGlobalLayout() {
            if(resized) {
                return;
            }
            if(baseHeight <= 0) {
                baseHeight = contentView.getHeight();
                return;
            }
    
            final int diff = baseHeight - contentView.getHeight();
            if(diff > 0) {
                // keyboard is visible
                window.update( - 1, baseHeight - diff - yPos);
                resized = true;
            }
        }
    });
    

これを行うと、SoftKeyboard が非表示になっていても、PopupWindow のサイズが変更されたままになります。PopupWindow の方が小さいため、GlobalLayout イベントは発生しません。

パート 2 :偽の PopupWindow を使用して、SoftKeyboard が非表示になっているかどうかを確認します (dirty :()

  • 偽の PopupWindow を実際の PopupWindow の高さで構築する
  • 本物を捨てるときは、偽物も忘れずに捨てる
  • 本物の前に偽物を見せる

    buildFakePopupWindow(rootHeight);
    window.setOnDismissListener(new OnDismissListener() {
    
        @Override
        public void onDismiss() {
            if(fakeWindow != null) {
                fakeWindow.dismiss();
            }
        }
    });
    fakeWindow.showAtLocation(parent, Gravity.NO_GRAVITY, xPos, yPos);
    
  • 偽物に GlobalLayoutListener を登録する

     final View fakeContentView = fakeWindow.getContentView();
    fakeContentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    
        int baseHeight = 0;
    
        @Override
        public void onGlobalLayout() {
            if(baseHeight <= 0) {
                baseHeight = fakeContentView.getHeight();
                return;
            }
            final int diff = baseHeight - fakeContentView.getHeight();
            if(diff <= 0 && resized) {
                window.update( - 1, WindowManager.LayoutParams.WRAP_CONTENT);
                resized = false;
            }
        }
    });
    

それは汚い解決策だと確信していますが、それを行う別の方法は見つかりませんでした。

于 2012-11-29T15:16:09.187 に答える