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


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.