Прокрутите экран вверх, когда появится клавиатура

У меня есть активность с editText посередине. Когда я нажимаю на editText, появляется клавиатура, и экран движется так, что editText находится чуть выше клавиатуры, охватывая другие вещи, которые находятся ниже.

Я не хочу изменять размер или добавлять дополнение к макету. Мне просто нужно, чтобы экран прокручивал вверху пространство, которое мне нужно, чтобы увидеть и другие вещи ниже. Другими словами, я хотел бы выбрать позицию editText, когда появится клавиатура. Этого было бы достаточно, если экран прокручивается полностью, показывая мне нижнюю часть макета.

Я попытался поместить макет в scrollView, добавив этот код в editText

    editText.setOnClickListener(new OnClickListener() {

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

        }
    });

но это не сработает. У кого-нибудь есть идея? Заранее благодарю вас!

Ответ 1

использовать android: windowSoftInputMode = "adjustPan"

"adjustResize"

Основное окно активности всегда изменяется, чтобы освободить место для экранной клавиатуры.

"adjustPan"

Основное окно операции не изменяется, чтобы освободить место для мягкой клавиатуры. Скорее, содержимое окна автоматически разворачивается так, что текущий фокус никогда не скрывается клавиатурой, и пользователи всегда могут видеть, что они набирают. Это, как правило, менее желательно, чем изменение размера, поскольку пользователю может понадобиться закрыть мягкую клавиатуру, чтобы получить и взаимодействовать с затененными частями окна.

Например, запустите файл манифеста: -

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

Поздний ответ. Но, конечно, это помогает кому-то.

Ответ 2

У меня была аналогичная проблема один раз, я решил использовать:

    android:windowSoftInputMode="adjustResize"

в AndroidManifest.xml.

Если вы используете RelativeLayout, начните с нижнего элемента, который должен быть подключен к родительскому дну а затем подключить другой элемент выше предыдущего.

Если вы используете LinearLayout, оберните его в RelativeLayout и зацепите LinearLayout parentBottom.

Таким образом, когда клавиатура всплывает, вы увидите нижнюю часть вашего макета.

Надеюсь, что это поможет.

Ответ 3

У меня была эта проблема, я разрешил этот код:

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);
                }
            });

Ответ 4

Это работает для меня

android:windowSoftInputMode="stateVisible|adjustResize"

в androidmanifest для активности

Ответ 5

Добавьте эту библиотеку в ваши зависимости 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);
        }
    }
});

Ответ 6

Это работает: -

Существует проблема с прокруткой вверх, когда клавиатура открывается в макете ограничения. Не используйте это.

Для достижения "Прокрутите экран вверх, когда появляется клавиатура" Попробуйте это

Используйте линейный макет и 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>

Ответ 7

Это сработало для меня только после того, как я изменил макет ограничения на линейный макет и добавил

android:windowSoftInputMode="adjustResize".

и удалил

<item name="android:windowFullscreen">true</item> из стиля действий