2012-06-03 15 views
16

Złożyłem razem prosty projekt testowy, który wyświetla PopupWindow zawierający EditText (na Android 2.2). Kiedy pukam EditText, wyświetlana jest klawiatura ekranowa, tak jak się spodziewałam. Jednak miękka klawiatura obejmuje EditText i nie mogę przesuwać ekranu, aby zachować EditText w sposób, w jaki myślałem, że powinien. Mój kod:Miękka klawiatura obejmuje EditText w PopupWindow

TestAdjustPanActivity.java:

package com.example; 

import android.app.Activity; 
import android.graphics.drawable.BitmapDrawable; 
import android.os.Bundle; 
import android.view.Gravity; 
import android.widget.PopupWindow; 

public class TestAdjustPanActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final PopupWindow pw = new PopupWindow(this); 
     pw.setContentView(getLayoutInflater().inflate(R.layout.popup, null, false)); 
     pw.setWidth(400); 
     pw.setHeight(600); 
     pw.setFocusable(true); 

     pw.setOutsideTouchable(true); 
     pw.setTouchable(true); 
     pw.setBackgroundDrawable(new BitmapDrawable()); 

     // This is the line referred to in the edit: 
     pw.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 

     findViewById(R.id.main).post(new Runnable() { 
      public void run() { 
      pw.showAtLocation(findViewById(R.id.main), Gravity.NO_GRAVITY, 0, 0); 
      } 
     }); 
    } 
} 

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/main" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

</LinearLayout> 

popup.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="#666666" 
     android:orientation="vertical" > 

     <EditText 
      android:id="@+id/current_password" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="40dp" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="10dp" 
      android:layout_marginTop="300dp" /> 
    </LinearLayout> 

</ScrollView> 

... a moja nie zawiera AndroidManifest.xml linia android:windowSoftInputMode="stateUnspecified|adjustPan" w tagu dla jedynej aktywności w aplikacji.

Wszelkie pomysły? Żadne inne posty związane z tym problemem nie zrobiły tego za mnie. Czego mi brakuje, to utrzymywanie widoku z panoramowania tak, jak tego oczekiwałbym?

EDYCJA: Próbowałem dodać linię w TestAdjustPanActivity, jak wskazano, co spowodowało, że ekran idealnie panoramował na urządzeniu z systemem Android 3.2, które mam. Jednak wciąż nie przesuwa się na moim urządzeniu z Androidem 2.2, co czyni to jeszcze bardziej zagmatwanym.

Odpowiedz

4

Dla każdego, natrafiają na to w przyszłości, skończyło się tylko za pomocą okna dialogowego, zamiast PopupWindow i przesuwanie w celu zachowania widoku EditText działa poprawnie w wersji 2.2 z oknem dialogowym.

0

należy zmienić

android:windowSoftInputMode="stateUnspecified|adjustPan 

do

android:windowSoftInputMode="stateHidden|adjustPan" 
+0

Meh, no luck niestety. W każdym razie dzięki! – Lewis

3

Jest prostszy sposób. Po prostu podaj alternatywny układ aktywnej klawiatury.

  1. Lewy przycisk wyboru projektu: "Narzędzia Android/Nowy plik zasobów ...".
  2. Wybierz układ, podaj nazwę pliku "main" (nie przejmuj się konfliktami).
  3. Kliknij "dalej". Następnie na liście po lewej wybierz "klawiaturę" i przesuń ją w prawo (kliknij "->").
  4. Po prawej stronie wybierz stan klawiatury.
  5. Kliknij Zakończ.
  6. Teraz skopiuj zawartość pliku main.xml znajdującego się w "res/layout" do nowego pliku w res/layout-keyssoft ".
  7. Popraw nowy układ w taki sposób, aby klawiatura nie była w ten sposób. „id” s dla odpowiednich składników w tych dwóch układów (dlatego skopiować pasta była potrzebna).
  8. Ciesz się, jak to działa

Przeczytaj o configuration changes zrozumieć jak to działa. Należy pamiętać, że każda zmiana konfiguracji (orientacja zmiana, zmiana języka, ...) spowoduje odtworzenie działania (w takim przypadku argument onCreate nie ma wartości null), więc możesz podać różne układy dla różnych ent przypadkach.

+0

Zgodnie z dokumentami systemu Android działa to tylko w przypadku, gdy faktyczna dostępność klawiatury zmienia się, nie w przypadku, gdy jest ona wyświetlana lub ukryta, niestety. Wspominają jednak o keyboardHidden właściwości klasy Configuration, którą przyjrzę. Dzięki! – Lewis

1

zmiana ta

android:windowSoftInputMode="stateUnspecified|adjustPan" 

do

android:windowSoftInputMode="adjustPan" 

tylko w swoim pliku manifestu

Powiązane problemy