web-dev-qa-db-ja.com

ソフトキーボードの寸法を取得する

画面に表示されているキーボードのサイズを知る方法はありますか?

私はプログラミングにCocos2dxを使用していますが、画面のAndroidまたはCocosの部分に表示されるキーボードの高さは重要ではありません。

KeyboardにはgetHeight()メソッドがあることは知っていますが、新しいキーボードを作成したくないので、デフォルトのキーボードを使用したいと思います。

25
Rudy_TM

これでやった

myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {

                    Rect r = new Rect();
                    parent.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parent.getRootView().getHeight();
                    int heightDifference = screenHeight - (r.bottom - r.top);
                    Log.d("Keyboard Size", "Size: " + heightDifference);

                }
            });

キーボードでビューのサイズを変更するだけなので、これを使用できます。

35
Rudy_TM
Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);

この結果は、アプリケーションが画面上で使用するスペースの量です(アクティビティがnotサイズ変更された場合でも機能します)。明らかに、残りの画面スペースがキーボードによって使用されます(表示されている場合)

ここでidを見つけました: https://github.com/freshplanet/ANE-KeyboardSize/blob/master/Android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.Java

21
FDIM

以下のコードを使用して、アクティビティがフルスクリーンでない場合:

content.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    if (keyBoardHeight <= 100) {
                        Rect r = new Rect();
                        content.getWindowVisibleDisplayFrame(r);

                        int screenHeight = content.getRootView()
                                .getHeight();
                        int heightDifference = screenHeight
                                - (r.bottom - r.top);
                        int resourceId = getResources()
                                .getIdentifier("status_bar_height",
                                        "dimen", "Android");
                        if (resourceId > 0) {
                            heightDifference -= getResources()
                                    .getDimensionPixelSize(resourceId);
                        }
                        if (heightDifference > 100) {
                            keyBoardHeight = heightDifference;
                        }

                        Log.d("Keyboard Size", "Size: " + heightDifference);
                    }
                    // boolean visible = heightDiff > screenHeight / 3;
                }
            });
9
Habbot Phan

アクティビティのサイズが変わらない間に仮想キーボードの高さを計算する場合(adjustPan)、次のサンプルを使用できます。

https://github.com/siebeprojects/samples-keyboardheight

ウィンドウとアクティビティのルートビューの高さの差を計算するために、非表示のウィンドウを使用します。

5
Siebe Brouwer

これは古い投稿であることは知っていますが、選択したソリューションがすべてのデバイスで機能しないことに気付きました。矛盾があるように見えたので、私はこれを実装しましたが、それはすべてをキャッチしているようです:

        final int[] discrepancy = new int[1];
        discrepancy[0] = 0;

        // this gets the height of the keyboard
        content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                View rootview = activity.getWindow().getDecorView(); // this = activity
                rootview.getWindowVisibleDisplayFrame(r);

                int screen_height = rootview.getRootView().getHeight();
                int keyboard_height = screen_height - (r.bottom + r.top) - discrepancy[0];

                if (discrepancy[0] == 0) {
                    discrepancy[0] = keyboard_height;
                    if (keyboard_height == 0) discrepancy[0] = 1;
                }

                int margin_bottom = keyboard_height + Helper.getDp(10, activity);

                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) carousel_container.getLayoutParams();
                params.setMargins(0, 0, 0, margin_bottom);

                //boolean visible = heightDiff > screenHeight / 3;
            }
        });

リスナーが最初に呼び出されると、キーボードなしで画面を測定し、不一致がある場合は次回にそれを考慮します。食い違いがない場合は、食い違いを1に設定し、0にならないようにします。

3
noshaf

わかりません。いいえ、本当に:あなたは単に言うことができません。

キーボードは特定の形状である必要はありません。画面の下部に配置する必要はありません( 多く最も人気のある オプション ではない )、配置する必要はありませんテキストフィールドを変更しても現在のサイズを維持します(フラグによってはほとんど変更されません)。 rectangular である必要さえありません。また、 画面全体 のみを引き継ぐ場合もあります。

3
ctate

cocos2d-xには、CCEditBoxがあります。

Extensions-> GUI-> CCEditBoxの中に、クラスCCEditBoxがあります。

美しさは、シーンのどこかをタップするキーボードを隠すことです。編集ボックスがシーンの低すぎる位置にある場合、キーボードを自動的に上に移動します。

Cocos2d-x v2.1.3を使用している場合は、次の場所に移動してサンプルプロジェクトに移動できます。

samples-> cpp-> TestCpp-> Classes-> ExtensionTest-> EditBoxTest。

今後はCCTextFieldの代わりに使用します。ちょうど昨日それに出くわしました:)

2
Azhar Yousuf

数時間の検索の後、解決策を見つけました_windowSoftInput="adjustPan"_を設定する場合

コードスニペットは次のとおりです。

_    final View root  = findViewById(Android.R.id.content);
    root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    Rect r = new Rect();
    {
        root.getWindowVisibleDisplayFrame(r);
    }
    @Override
    public void onGlobalLayout() {
        Rect r2 = new Rect();
        root.getWindowVisibleDisplayFrame(r2);
        int keyboardHeight = r.height() - r2.height();
        if (keyboardHeight > 100) {
            root.scrollTo(0, keyboardHeight);
        }
        else {
            root.scrollTo(0, 0);
        }
    }
});
_

このコードでは、キーボードの高さを見つけた後、キーボードの高さを見つける主な理由であるキーボードで覆われないようにビューをスクロールします。

docs によると:

void getWindowVisibleDisplayFrame(Rect outRect)このビューがアタッチされているウィンドウが配置されている全体の表示サイズを取得します。

1
Ali Zeynali

完全な答えと私のために完璧に働いた:

  Rect r = new Rect();
  View rootview = this.getWindow().getDecorView(); // this = activity
  rootview.getWindowVisibleDisplayFrame(r);
  int keyboardHeight = rootview.getHeight() - r.bottom;
0
Amit

Androidディスプレイ画面のROOT_VIEWは、アクティビティのビューを表示するVISIBLE DISPLAY FRAMEを備えた単一のスクリーンビューとして視覚化できます。

この表示フレームは、ソフトキーボードが画面に表示または非表示になっているときに調整されます。

注:理解を深めるために、以下のリンクをクリックして2つの画像をご覧ください

したがって、ディスプレイ画面のルートビューは次のように視覚化できます。 ディスプレイ画面のルートビュー

ソフトキーボードの開閉による可視表示フレームの調整は、次のように視覚化できます。 VISIBLE_DISPLAY_SCREEN調整

VISUAL DISPLAY FRAMEのこの調整は、キーボードの高さを見つけるために非常によく使用できます。

(ソフトキーボードが開いているとき)

SOFT_KEYBOARD_HEIGHT = ROOT_VIEW_HEIGHT-(VISUAL_DISPLAY_FRAME_HEIGHT + EXTRA_SCREEN_HEIGHT)

上記を達成するためのコードは次のとおりです。

int mExtraScreenHeight=-1, mKeyboardHeight=-1;
boolean mKeyboardOpen;



    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            int rootViewHeight, visibleDisplayFrameHeight, fakeHeight;

            /* (rootViewHeight - visibleDisplayFrameHeight) is not the real height of the keyboard
                it is the fake height as it also consist of extra screen height
                so FAKE_HEIGHT = KEYBOARD_HEIGHT + EXTRA_SCREEN_HEIGHT

                To get keyboard height extra screen height must be removed from fake height
             */

            Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);

            rootViewHeight = rootView.getRootView().getHeight();
            visibleDisplayFrameHeight = rect.height();

            fakeHeight = rootViewHeight-visibleDisplayFrameHeight;

            if (mExtraScreenHeight == -1){
                mExtraScreenHeight=fakeHeight;
            }
            /* Suppose the soft keyboard is open then the VISIBLE_DISPLAY_FRAME is in reduced size
                due to the space taken up by extra screen and the keyboard but when the soft keyboard closes
                then KEYBOARD_HEIGHT=0 and thus FAKE_HEIGHT = EXTRA_SCREEN_HEIGHT
             */
            else if (fakeHeight <= mExtraScreenHeight){
                mExtraScreenHeight=fakeHeight;
                mKeypadOpen=false;
            }
            else if (fakeHeight > mExtraScreenHeight){
                mKeypadHeight=fakeHeight-mExtraScreenHeight;
                mKeypadOpen=true;
            }
        }
    });

[〜#〜] note [〜#〜]:onGlobalLayout()関数は、ソフトキーボードが開いたときなど、グローバルレイアウトが変更されたときにのみ呼び出されます。 。したがって、ソフトキーボードの高さを取得するには、ソフトキーボードを少なくとも1回開く必要があります。

それは私のために働いた;)

0
Pratik Gawali

コメントできず申し訳ありませんが、2つまたは3つの答えが問題の解決に役立ちました。これらは、AddOnGlobalLayoutListenerを使用して、キーボードが表示される前後の残りの高さを決定することに関連していました。

私が使用したソリューションは、Rudy_TMの回答に基づいていました。

ただし、私が見つけなければならないことの1つは、そのメソッドが機能するためには、次の行がどこかになければならないということです。

Window.SetSoftInputMode(SoftInput.AdjustResize);

SoftInput.AdjustNothing(またはそのようなもの)を入手する前に、それは機能しませんでした。今では完璧に動作します。答えてくれてありがとう!

0
Kalikovision