web-dev-qa-db-ja.com

キーボードが表示されたら画面を上にスクロールします

中央にeditTextがあるアクティビティがあります。 editTextをクリックすると、キーボードが表示され、画面が移動して、editTextがキーボードのすぐ上になり、下にある他のものが覆われます。

サイズを変更したり、レイアウトにパディングを追加したりしません。画面をスクロールして、下にある他のものも表示する必要があるスペースを一番上までスクロールする必要があります。つまり、キーボードが表示されたときのeditTextの位置を選択したいのです。画面が完全に上にスクロールして、レイアウトの下部が表示されていれば十分です。

このテキストをeditTextに追加してscrollViewにレイアウトを配置しようとしました

    editText.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //make the view scroll down to the bottom
            scrollView.scrollTo(0, scrollView.getBottom());

        }
    });

しかし、それは機能しません。誰にもアイデアがありますか?前もって感謝します!

22
giangiska

Android:windowSoftInputMode = "adjustPan"を使用します

"adjustResize"

アクティビティのメインウィンドウは、画面上のソフトキーボード用のスペースを確保するために常にサイズ変更されます。

"adjustPan"

アクティビティのメインウィンドウは、ソフトキーボード用のスペースを確保するためにサイズ変更されません。むしろ、ウィンドウの内容は自動的にパンされるため、現在のフォーカスがキーボードによって隠されることはなく、ユーザーは入力内容を常に見ることができます。これは、ユーザーがソフトキーボードを閉じてウィンドウの不明瞭な部分にアクセスしたり操作したりする必要があるため、一般にサイズ変更よりも望ましくありません。

たとえば、マニフェストファイルに:-

       <activity
    Android:windowSoftInputMode="adjustPan"
    Android:name=".MainActivity"></activity>

遅い答えですが、確かにそれは誰にも役立ちます。

29
Ranjith Kumar

私は一度同様の問題を抱えていた、私は使用して解決しました:

    Android:windowSoftInputMode="adjustResize"

androidManifest.xmlで。

RelativeLayout を使用する場合、親の最下部にフックする必要がある最下部のエレメントから開始し、次に、前のエレメントの上に他のエレメントをフックします。

LinearLayout を使用する場合は RelativeLayout でラップし、 LinearLayout をparentBottomにフックします。

このようにして、キーボードがポップアップすると、レイアウトの下部が表示されます。

お役に立てれば。

17
DrChivas

私はこの問題を抱えていました、私はこのコードで解決しました:

myEdittext.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    myscrollview.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            View lastChild = myscrollview.getChildAt(myscrollview.getChildCount() - 1);
                            int bottom = lastChild.getBottom() + myscrollview.getPaddingBottom();
                            int sy = myscrollview.getScrollY();
                            int sh = myscrollview.getHeight();
                            int delta = bottom - (sy + sh);
                            myscrollview.smoothScrollBy(0, delta);
                        }
                    }, 200);
                }
            });
8
user6581344

これは私のために働く

Android:windowSoftInputMode="stateVisible|adjustResize"

アクティビティのandroidmanifestで

5
Vinayaka Dj

これを library をgradle依存関係に追加します。

dependencies {
    compile 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0'
}

そして、このコードを使用します:

KeyboardVisibilityEvent.setEventListener(getActivity(), new KeyboardVisibilityEventListener() {
    @Override
    public void onVisibilityChanged(boolean isOpen) {

        if (isOpen && MY_EDIT_TEXT.hasFocus()) {

            //scroll to last view
            View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
            int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
            int sy = scrollLayout.getScrollY();
            int sh = scrollLayout.getHeight();
            int delta = bottom - (sy + sh);

            scrollLayout.smoothScrollBy(0, delta);
        }
    }
});
2
Nobody8

これは動作します:-

Constraint Layoutでキーボードが開いたときのスクロールアップに問題があります。使用しないでください。

「キーボードが表示されたら画面を上にスクロールする」を実現するにはこれを試してください

線形レイアウトおよびScrollViewを使用します

スクロールビューでfill_parent。スクロールビューのテキストフィールド。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:layout_width="match_parent"
   Android:layout_height="match_parent"
   Android:orientation="vertical"
   Android:gravity="center">

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:fillViewport="true">


</ScrollView>
</LinearLayout>
1

Constraint LayoutからLinear Layoutに変更して追加した後にのみ機能しました

Android:windowSoftInputMode="adjustResize"

そして削除

<item name="Android:windowFullscreen">true</item>アクティビティスタイルから

0
Helio Bentes