webdevqa.jp.net

Android)で仮想キーボードの高さを取得します

Androidで仮想キーボードの高さを取得するにはどうすればよいですか?出来ますか?

メインウィンドウから取得しようとしていますが、アプリケーションの高さが完全にわかります。しかし、キーボードの高さを取得したいと思います。

15
Adem

キーボードの高さを取得することはできませんが、ビューの高さを取得することはできます。これは、本当に必要なものです。このデータは、現在のビューへのonLayout呼び出しに提供されます。

4
chrisdowney

したくない場合はAndroid:windowSoftInputMode="adjustResize"アプリ内。あなたはこのようなことを試すことができます:

    any_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int height = main_layout.getHeight();
            Log.w("Foo", String.format("layout height: %d", height));
            Rect r = new Rect();
            main_layout.getWindowVisibleDisplayFrame(r);
            int visible = r.bottom - r.top;
            Log.w("Foo", String.format("visible height: %d", visible));
            Log.w("Foo", String.format("keyboard height: %d", height - visible));
        }
    });
1
Ormei

レイアウトのrootViewがRelativeLayoutであると仮定しましょう。何ができるかは、RelativeLayoutを拡張し、その中のonSizeChangedメソッドをオーバーライドするクラスCustomRelativeLayoutを作成します。そのため、ソフトキーボードが開くと、RelativeLayoutの高さが変更され、onSizeChangedメソッド内で変更が通知されます。

public class CustomRelativeLayout extends RelativeLayout {

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    int softKeyboardHeight = oldh - h; // Assuming softKeyboard Opened up
    // oldh is the height when the layout was covering the whole screen
    // h is the new height of the layout when the soft keyboard opened up

    if(softKeyboardHeight > oldh * 0.15) {
        Log.i("Here", Integer.toString(softKeyboardHeight));
        // Keyboard has popped up

    } else {
        // Not the keyboard
    }
}

マニフェストファイルでこれらの変更を行い、アクティビティがパンアンドスキャンモードではなくサイズ変更モードで開くようにします。サイズ変更モードでは、keybaordが開いたときにレイアウトのサイズを変更できます。パンスキャンとサイズ変更の詳細については、 https://developer.Android.com/training/keyboard-input/visibility をご覧ください。

<activity
        Android:name=".MainActivity"
        Android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
1
Prashuk Jain

このサンプルコードを使用できます。それは汚い解決策ですが、それは機能します

Thread t = new Thread(){
            public void run() {
                int y = mainScreenView.getHeight()-2;
                int x = 10;
                int counter = 0;
                int height = y;
                while (true){
                    final MotionEvent m = MotionEvent.obtain(
                            SystemClock.uptimeMillis(),
                            SystemClock.uptimeMillis(),
                            MotionEvent.ACTION_DOWN,
                            x, 
                            y,
                            INTERNAL_POINTER_META_STATE);
                    final MotionEvent m1 = MotionEvent.obtain(
                            SystemClock.uptimeMillis(),
                            SystemClock.uptimeMillis(),
                            MotionEvent.ACTION_UP,
                            x, 
                            y,
                            INTERNAL_POINTER_META_STATE);
                    boolean pointer_on_softkeyboard = false;
                    try {
                        getSingletonInstrumentation().sendPointerSync(m);
                        getSingletonInstrumentation().sendPointerSync(m1);
                    } catch (SecurityException e) {
                        pointer_on_softkeyboard = true;
                    }
                    if (!pointer_on_softkeyboard){
                        if (y == height){
                            if (counter++ < 100){
                                Thread.yield();
                                continue;
                            }
                        } else if (y > 0){
                            softkeyboard_height = mainScreenView.getHeight() - y;
                        }
                        break;
                    }
                    y--;

                }
                if (softkeyboard_height > 0 ){
                    // it is calculated and saved in softkeyboard_height
                } else {
                    calculated_keyboard_height = false;
                }
            }
        };
        t.start();
1
Adem

この解決策もハッキーですが、問題を解決します(少なくとも私にとっては)。

  1. 画面の下部に背景が透明な一時的なビューの場所があります。したがって、このビューは非表示になります。
  2. マニフェストのアクティビティタグに_Android:windowSoftInputMode="adjustResize"_フラグを追加しました。
  3. 現在、メインストーリーはonGlobalLayout()にあります。そこで、温度ビューのy軸とルートビューの高さの差を計算します

    最終ビュービュー= findViewById(R.id.base); view.getViewTreeObserver()。addOnGlobalLayoutListener(new OnGlobalLayoutListener(){

    _@Override
    public void onGlobalLayout() {
    
        int rootViewHeight = view.getRootView().getHeight();
        View tv = findViewById(R.id.temp_view);
        int location[] = new int[2];
        tv.getLocationOnScreen(location);
        int height = (int) (location[1] + tv.getMeasuredHeight());
        deff = rootViewHeight - height;
        // deff is the height of soft keyboard
    
    }
    _

    });

1
Gem

これを試して

KeyboardView keyboardView = new KeyboardView(getApplicationContext(), null);
int height = (keyboardView.getKeyboard()).getHeight();
Toast.makeText(getApplicationContext(), height+"", Toast.LENGTH_LONG).show();
0
Rider