Прокрутка сторінки, коли з’явилася м’яка клавіатура


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>

Як ви бачите вище, простий макет складається з трьох полів введення та кнопки "Ok".

Я запускаю свою програму з вищезазначеним макетом, коли я натискаю на 1-е поле введення ( @+id/input_one), м’яка клавіатура вискакує знизу екрана, вона приховує 3-те поле введення та кнопку "Ok".

Оскільки я використовую <ScrollView>, я думав, що можу прокрутити сторінку вгору, щоб побачити 3-те поле введення та кнопку "Ok", які приховані програмною клавіатурою, але сторінку не можна прокручувати . Чому? Як від нього позбутися? в основному, я хотів би бачити кожне поле введення та кнопку "Ok", навіть спливаюча клавіатура.


1
видаліть <ScrollView>, LinearLayout має бути вашим зовнішнім макетом, він буде працювати, я сподіваюся, навіть якщо вискочить програмна панель.
— Абід А. Чаудхарі,

1
@pakshaheen Це не вирішить проблему, коли потрібен режим прокрутки.
— Лютен

Відповіді:


125

Я виправив цю проблему, визначивши наступний атрибут <activity>з AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

12
Вам не потрібен stateVisible. Завдяки цьому м’яка клавіатура з’явиться під час запуску програми, навіть коли користувач не зосереджений на EditText
— RajV

це автоматично відкрита клавіатура, навіть там немає редагування тексту
— 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

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

Сподіваюся, це допомагає іншим, хто має таку ж проблему.

EDIT: Я отримав невеликий обхідний шлях для своєї справи, тому опублікував його тут :

Я не впевнений, чи це допоможе вам, але це точно допоможе вам зрозуміти та прояснить деякі речі.

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


+1 У моєму випадку рядок стану був прихований сторонньою бібліотекою в коді: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
— de.

@qweret Що робити, якщо мені потрібні обидва? Повний екран і прокрутка.
— Prabs

@Prabs Ви знайшли якесь рішення? Я також хочу як повний екран, так і прокрутку.
— Джонні

@Johny Nope. На даний момент я використовую повноекранний режим для всього додатка, за винятком тієї діяльності зі прокруткою3.
— Прабс

@Prabs Єдиним рішенням, яке я вважав, є прозорий рядок стану, але в моєму випадку це ще проблема, оскільки я хочу підтримувати API> = 16. Ви маєте ідею?
— Джоні,

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, а RelativeLayoutякий містить a, LinearLayoutякий потім містить aScrollView
— James Heald

11

У вашому властивості Manifestdefine windowSoftInputMode:

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

2
@JacobRas, будь ласка, перевірте це посилання: developer.android.com/reference/android/… воно має значення "AdjuNothing" :)
— Мохаммад Ерсан,

2
У мене такі самі проблеми, але прокрутка не працює з налаштуваннямНічого :(
— Нарендра Сінгх

8

перевірити це.

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

3

Це працювало лише для мене:

android:windowSoftInputMode="adjustPan"

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.