Przewijanie strony, gdy pojawiła się klawiatura ekranowa


99

Mam <ScrollView>układ:

<?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>

Jak widać powyżej, prosty układ składa się z trzech pól wprowadzania i przycisku „Ok”.

Uruchamiam moją aplikację w powyższym układzie, kiedy stuknę w pierwsze pole wprowadzania ( @+id/input_one), klawiatura ekranowa wyskoczy z dołu ekranu, ukryje trzecie pole wprowadzania i przycisk „OK”.

Odkąd używam <ScrollView>, pomyślałem, że mogę przewinąć stronę w górę, aby zobaczyć trzecie pole wprowadzania i przycisk „OK”, które są ukryte za pomocą miękkiej klawiatury, ale strony nie można przewijać . Czemu? Jak się go pozbyć? w zasadzie chciałbym zobaczyć wszystkie pola wprowadzania i przycisk „OK”, nawet pojawiła się klawiatura ekranowa.


1
usuń <ScrollView>, LinearLayout powinien być twoim zewnętrznym układem, będzie działał, mam nadzieję, że nawet jeśli pojawi się sofkeyboard.
Abid A. Chaudhary

1
@pakshaheen To nie rozwiąże problemu, gdy wymagany jest widok przewijania.
Luten

Odpowiedzi:


125

Naprawiłem problem poprzez zdefiniowanie w następujący atrybut <activity>z AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

12
Nie potrzebujesz stateVisible. To spowoduje, że miękka klawiatura pojawi się po uruchomieniu aplikacji, nawet jeśli użytkownik nie jest skoncentrowany na
EditText

to automatycznie otwarta klawiatura, nawet jeśli nie ma edycji
Mr X

37

Ok, przeszukałem teraz kilka godzin, aby znaleźć problem i znalazłem go.

Żadna ze zmian nie polubiła fillViewport="true"ani nie android:windowSoftInputMode="adjustResize"pomogła mi.

Używam Androida 4.4 i to jest duży błąd :

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

W jakiś sposób motywy pełnoekranowe uniemożliwiają przewijanie ScrollViews, gdy widoczny jest SoftKeyboard.

W tej chwili zamiast tego użyłem tego:

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

Nie wiem, jak pozbyć się górnego paska systemowego z wyświetlaniem czasu i baterii, ale przynajmniej mam problem.

Mam nadzieję, że pomoże to innym, którzy mają ten sam problem.

EDYCJA: Mam małe obejście mojego przypadku, więc opublikowałem to tutaj :

Nie jestem pewien, czy to zadziała, ale na pewno pomoże ci to zrozumieć i wyjaśnić kilka rzeczy.

EDIT2: Oto kolejny dobry temat, który pomoże ci podążać we właściwym kierunku, a nawet rozwiązać twój problem.


+1 W moim przypadku pasek stanu został ukryty przez bibliotekę innej firmy w kodzie: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de.

@qweret A jeśli potrzebuję ich obu? Pełny ekran i przewijanie.
Prabs

@Prabs Czy znalazłeś jakieś rozwiązanie? Chcę też mieć pełny ekran i przewijanie.
Johny

@Johny Nope. Na razie używam pełnego ekranu dla całej aplikacji, z wyjątkiem tej aktywności z przewijaniem3.
Prabs

@Prabs Jedynym rozwiązaniem, o którym myślałem, jest przezroczysty pasek stanu, ale w moim przypadku nadal jest to problem, ponieważ chcę obsługiwać API> = 16. Masz jakiś pomysł?
Johny

20

Dla mnie jedyne, co działa, to działanie w manifeście tego atrybutu:

android:windowSoftInputMode="stateHidden|adjustPan"

Aby nie pokazywać klawiatury podczas otwierania działania i nie nakładać się na dół widoku.


14

umieść to w swoim Manifeście w ten sposób w trybie Brak trybu pełnoekranowego

android:windowSoftInputMode="stateVisible|adjustPan" 

w twoim manifeście

<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
Próbowałem tego, ale niestety bez powodzenia ... Jednak widok główny nie jest a ScrollView, ale RelativeLayoutzawiera a, LinearLayoutktóry zawiera aScrollView
James Heald


8

Sprawdź to.

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

3

To zadziałało tylko dla mnie:

android:windowSoftInputMode="adjustPan"

2

Również, jeśli chcesz to zrobić programowo, po prostu dodaj poniższy wiersz do onCreate działania.

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

1

Możesz spróbować użyć następującego kodu, aby rozwiązać problem:

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

17
Powinieneś zawracać sobie głowę wyjaśnieniem, co robi twój kod, zamiast po prostu publikować suchy kod kawałkowy jako odpowiedź.
Angel Politis

0

cóż, najprostszą odpowiedzią, jaką wypróbowałem, jest po prostu usunięcie kodu, co powoduje, że aktywność jest wyświetlana na pełnym ekranie.

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

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

Właśnie usunąłem swój kod i działa całkowicie dobrze, chociaż jeśli chcesz to osiągnąć na pełnym ekranie, musisz wypróbować inne metody

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.