adjustPan nie uniemożliwia klawiaturze zakrycia EditText

Próbuję stworzyć dość prosty ekran czatu z ListView wyświetlający tekst i edytowany tekst na dole i przycisk "Wyślij" po prawej stronie edytowanego tekstu. Wszystko jest funkcjonalne, ale kiedy klikam EditText, wirtualna klawiatura go zakrywa. Ekran przesuwa się trochę, ale nie na tyle, aby stać się widocznym nad klawiaturą. Mam znacznik" adjustPan "w moim manifeście, a także próbowałem znacznika "adjustResize" bez skutku. Zgaduję, że ma to coś wspólnego ze sposobem, w jaki mój układ jest ustawiony, ale szczerze mówiąc nie mam pojęcia. Proszę o pomoc!

Bieżący Układ...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ListView android:id="@+id/android:list" 
    android:layout_height="0dip" 
    android:layout_width="fill_parent"
    android:layout_weight="1"
    android:stackFromBottom="true">
</ListView>

<LinearLayout android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <EditText android:id="@+id/sendMessageBox"
        android:focusable="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:scrollbars="vertical"
        android:maxLines="4"
        android:text=""
        android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
        android:maxLength="1000"
        android:hint="Type your message..."
        android:imeOptions="actionSend"/>

    <Button android:id="@+id/sendMessageButton" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="Send"/>

</LinearLayout>

Author: honeal, 2010-12-30

7 answers

Po wielu poszukiwaniach najwyraźniej jest to coś, co nazywam pluskwą. Jeśli używasz znacznika pełnoekranowego (aby usunąć pasek stanu z aktywności), nie możesz użyć opcji "adjustResize" bez zawijania aktywności w widoku przewijania. Niestety dla mnie używam ListView, który stworzyłby kolejny problem. Mam dość bałaganu i prawdopodobnie zrezygnuję z pełnoekranowego działania.

 45
Author: honeal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-25 04:10:41

W pliku manifestu musisz ustawić odpowiednią Właściwość android:windowSoftInputMode. Ten atrybut jest ważny od API 3.

<activity
    ...
    android:windowSoftInputMode="adjustPan" >
</activity>

Opcje to: http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

  • stateUnspecified Stan miękkiej klawiatury (ukryty lub widoczny) nie jest określony. System wybierze odpowiedni stan lub będzie polegał na ustawieniu w motywie. to jest domyślne ustawienie dla zachowanie miękkiej klawiatury.
  • stateUnchanged miękka klawiatura jest utrzymywana w dowolnym stanie, w jakim była ostatnio, czy widoczna, czy ukryta, gdy aktywność pojawi się na pierwszy plan.
  • "stateHidden" miękka klawiatura jest ukryta, gdy użytkownik wybierze aktywność - to znaczy, gdy użytkownik podąża naprzód do aktywności, a nie wraca do niej z powodu opuszczenia innej aktywności.
  • stateAlwaysHidden the soft klawiatura jest zawsze ukryta, gdy główne okno aktywności ma fokus wprowadzania.
  • stateVisible miękka klawiatura jest widoczna, gdy jest to normalnie właściwe (gdy użytkownik przechodzi do głównego okna aktywności).
  • stateAlwaysVisible miękka klawiatura jest widoczna, gdy użytkownik wybiera aktywność - to znaczy, gdy użytkownik porusza się do przodu do aktywności, a nie do niej z powodu pozostawienia innej aktywność.
  • adjustUnspecified nie jest określone, czy główne okno aktywności zmienia rozmiar, aby zrobić miejsce dla miękkiej klawiatury, czy też zawartość panelu okna, aby bieżąca ostrość była widoczna na ekranie. System automatycznie wybierze jeden z tych trybów w zależności od tego, czy zawartość okna ma jakieś widoki układu, które mogą przewijać swoją zawartość. Jeśli istnieje taki widok, okno zostanie zmienione, przy założeniu, że przewijanie może sprawić, że wszystkie zawartość okna widoczna na mniejszym obszarze. Jest to domyślne ustawienie zachowania głównego okna.
  • adjustResize główne okno aktywności jest zawsze zmieniane, aby zrobić miejsce dla miękkiej klawiatury na ekranie.
  • adjustPan główne okno aktywności nie jest zmieniane, aby zrobić miejsce dla miękkiej klawiatury. Zamiast tego zawartość okna jest automatycznie przesuwana, dzięki czemu bieżąca ostrość nigdy nie jest zasłonięta przez klawiaturę, a użytkownicy mogą zawsze zobacz, co piszą. Jest to na ogół mniej pożądane niż zmiana rozmiaru, ponieważ użytkownik może potrzebować zamknąć miękką klawiaturę, aby wejść i wejść w interakcję z zasłoniętymi częściami okna.
 28
Author: LocalPCGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 06:30:27

Jeśli ustawisz android:windowSoftInputMode="adjustResize" dla aktywności w manifeście, to widok przewijania (lub inne zwijalne grupy widoków) zmniejszy się, aby pomieścić miękką klawiaturę. Jeśli jednak ustawisz android:windowFullscreen="true" w motywie aktywności, widok przewijania nie zmniejszy się, ponieważ jest zmuszony do wypełnienia całego ekranu. Jednak ustawienie android:fitsSystemWindows="false" w temacie również powoduje, że adjustResize nie działa

 8
Author: BadYous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-27 14:37:59

Miałam to na AndroidManifest. Spowodowało to, że adjustPan przestało działać poprawnie. Usunąłem blok poniżej i wszystko działa dobrze ponownie.

<supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="false"
        android:anyDensity="false" />
 1
Author: JeffRegan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-10 21:45:07

Oto jedno obejście, które znalazłem. Otwórz problematyczny editText i naciśnij klawisz RETURN. Zauważ, że przesuwa editText bliżej pozycji, na którą strzelasz.

Więc chociaż hacky, możesz zasadniczo zadowolić nową linię na górze edittext.

To również wydaje się działać przy użyciu nowej linii na dole, ale trzeba użyć opóźnienia, aby nie dodawać nowej linii, dopóki miękka klawiatura nie zostanie animowana na miejscu.

Uwaga mam ten problem tylko na niektórych telefony (DroidX).

if (android.os.Build.MODEL.equals("DROIDX")) {
        inputEt.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                    String text = inputEt.getText().toString();
                    text = "\n\n" + text.trim();
                    inputEt.setText(text);  
                    inputEt.setSelection(text.length());
                }
            });
        }
 0
Author: paulpooch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-08 21:56:38

Spróbuj dodać android:windowSoftInputMode="adjustResize|stateVisible|stateAlwaysHidden" do manifestu.

 0
Author: user3030130,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 18:44:25

Możesz wypróbować następujące ustawienia:

<supports-screens
android:anyDensity="true"/>
 -10
Author: kinkoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-12 16:13:19