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.

Leem.fin
źródło
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
oto działający kod. stackoverflow.com/questions/7417123/…
Venkat

Odpowiedzi:

125

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

android:windowSoftInputMode="adjustResize"
Leem.fin
źródło
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.

qweret
źródło
+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.

Jachumbelechao Unto Mantekilla
źródło
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>
user3594530
źródło
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
11

W Twojej Manifestzdefiniowanej windowSoftInputModewłaściwości:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustNothing">
Mohammad Ersan
źródło
2
@JacobRas, sprawdź ten link: developer.android.com/reference/android/ ... ma wartość „adjustNothing” :)
Mohammad Ersan
2
Mam ten sam problem, ale scrollview nie działa z wyregulujNothing :(
Narendra Singh
8

Sprawdź to.

<activity android:name=".Calculator"
    android:windowSoftInputMode="stateHidden|adjustResize" 
    android:theme="@android:style/Theme.Black.NoTitleBar">
</activity>
Ravi1187342
źródło
3

To zadziałało tylko dla mnie:

android:windowSoftInputMode="adjustPan"
blueware
źródło
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 );
ucMedia
źródło
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>
Энхжин Амарсайхан
źródło
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

Akash Gupta
źródło