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

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

Leem.fin
источник
1
удалите <ScrollView>, LinearLayout должен быть вашим внешним макетом, он будет работать, я надеюсь, даже если появится экранная клавиатура.
Абид А. Чаудхари
1
@pakshaheen Это не решит проблему, когда требуется scrollview.
Luten
вот рабочий код. stackoverflow.com/questions/7417123/…
Венкат

Ответы:

125

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

android:windowSoftInputMode="adjustResize"
Leem.fin
источник
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: вот еще одна хорошая тема, которая поможет вам пойти в правильном направлении или даже решить вашу проблему.

Qweret
источник
+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"

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

Jachumbelechao Unto Mantekilla
источник
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>
user3594530
источник
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>
Рави1187342
источник
3

Это сработало только для меня:

android:windowSoftInputMode="adjustPan"
голубая посуда
источник
2

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

getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | 
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE );
ucMedia
источник
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);
    }

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

Акаш Гупта
источник