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.