Прокрутка страницы при появлении мягкой клавиатуры


99

У меня есть <ScrollView>макет:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_scrollview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/input_one"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_two"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_three"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

          <Button
            android:id="@+id/ok_btn"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/ok_str" />

      </LinearLayout>
</ScrollView>

Как вы видите выше, простой макет состоит из трех полей ввода и кнопки «ОК».

Я запускаю свое приложение с указанным выше макетом, когда я нажимаю на первое поле ввода ( @+id/input_one), в нижней части экрана появляется мягкая клавиатура, она скрывает третье поле ввода и кнопку «ОК».

Поскольку я использую <ScrollView>, я подумал, что могу прокрутить страницу вверх, чтобы увидеть 3-е поле ввода и кнопку «ОК», которые скрыты программной клавиатурой, но страница не прокручивается . Зачем? Как от этого избавиться? в основном, я хотел бы видеть все поля ввода и кнопку «ОК», даже мягкую клавиатуру.


1
удалите <ScrollView>, LinearLayout должен быть вашим внешним макетом, он будет работать, я надеюсь, даже если появится экранная клавиатура.
Абид А. Чаудхари

1
@pakshaheen Это не решит проблему, когда требуется scrollview.
Luten

Ответы:


125

Я исправил эту проблему, определив следующий атрибут <activity>из AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

12
StateVisible не нужен. Это заставит мягкую клавиатуру появляться при запуске приложения, даже если пользователь не сфокусирован на EditText
RajV

это автоматически открытая клавиатура, даже если там нет edittext
Mr X

37

Хорошо, я искал несколько часов, чтобы найти проблему, и нашел ее.

Ни одно из изменений мне не понравилось fillViewport="true"и не android:windowSoftInputMode="adjustResize"помогло.

Я использую Android 4.4, и это большая ошибка :

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

Каким-то образом полноэкранные темы предотвращают прокрутку ScrollViews, когда отображается SoftKeyboard.

На данный момент я вместо этого использовал это:

android:theme="@android:style/Theme.Black.NoTitleBar

Я не знаю, как избавиться от верхней системной панели с отображением времени и батареи, но, по крайней мере, у меня есть проблема.

Надеюсь, это поможет другим, у кого такая же проблема.

РЕДАКТИРОВАТЬ: У меня есть небольшое обходное решение для моего случая, поэтому я разместил его здесь :

Я не уверен, что это сработает для вас, но это определенно поможет вам понять и прояснить некоторые вещи.

EDIT2: вот еще одна хорошая тема, которая поможет вам пойти в правильном направлении или даже решить вашу проблему.


+1 В моем случае строка состояния была скрыта сторонней библиотекой в ​​коде: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de.

@qweret Что, если они мне понадобятся? Полный экран и прокрутка.
Prabs

@Prabs Вы нашли какое-нибудь решение? Еще мне нужен как полноэкранный режим, так и прокрутка.
Johny

@Johny Нет. Сейчас я использую полноэкранный режим для всего приложения, за исключением активности с прокруткой3.
Prabs

@Prabs Единственное решение, которое я думал, это прозрачная строка состояния, но в моем случае это все еще проблема, потому что я хочу поддерживать API> = 16. Есть ли у вас какие-либо идеи?
Johny

20

Для меня единственное, что работает, - это действие в манифесте этого атрибута:

android:windowSoftInputMode="stateHidden|adjustPan"

Чтобы не отображать клавиатуру при открытии действия и не перекрывать нижнюю часть представления.


14

поместите это в свой манифест вот так, в полноэкранном режиме

android:windowSoftInputMode="stateVisible|adjustPan" 

в вашем манифесте

<activity
    android:windowSoftInputMode="stateVisible|adjustPan"
    android:name="com.example.patronusgps.MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

1
Я пробовал это, но безуспешно, совсем не повезло ... Тем не менее, корневое представление - это не a ScrollView, а a, RelativeLayoutкоторое содержит a, LinearLayoutкоторое затем содержит aScrollView
Джеймс Хилд

11

В вашем Manifestопределении windowSoftInputModeсвойства:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustNothing">

2
@JacobRas, пожалуйста, проверьте эту ссылку: developer.android.com/reference/android/… у нее есть значение «adjustNothing» :)
Мохаммад Эрсан

2
У меня та же проблема, но scrollview не работает с AdjustNothing :(
Нарендра Сингх

8

проверьте это.

<activity android:name=".Calculator"
    android:windowSoftInputMode="stateHidden|adjustResize" 
    android:theme="@android:style/Theme.Black.NoTitleBar">
</activity>


2

Также, если вы хотите сделать это программно, просто добавьте следующую строку в onCreate действия.

getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | 
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE );

1

Вы можете попробовать использовать следующий код для решения вашей проблемы:

 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>

17
Вам следует потрудиться объяснить, что делает ваш код, вместо того, чтобы просто публиковать сухой код в качестве ответа.
Angel Politis

0

Ну, самый простой ответ, который я пробовал, - просто удалить ваш код, который заставляет действие переходить в полноэкранный режим. У меня был такой код, который отвечал за то, чтобы моя деятельность переходила в полноэкранный режим:

if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT) {

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }

Я только что удалил свой код, и он работает полностью нормально, хотя, если вы хотите добиться этого в полноэкранном режиме, вам придется попробовать другие методы

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.