2012-06-03 8 views
16

Ho creato un semplice progetto di test che visualizza una finestra popup contenente un oggetto EditText (su Android 2.2). Quando tocco EditText, viene mostrata la tastiera virtuale, come mi aspetterei. Tuttavia, la tastiera virtuale copre EditText, e non riesco a far sì che lo schermo effettui il pan per mantenere in vista il testo di EditText nel modo in cui avrei pensato che fosse necessario. Il mio codice:La tastiera virtuale copre un EditText in una finestra popup

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> 

... e la mia AndroidManifest.xml contiene la riga android:windowSoftInputMode="stateUnspecified|adjustPan" nel tag per la sola e unica attività nell'app.

Qualche idea? Nessuno degli altri post su SO relativi a questo problema lo ha fatto per me. Che cosa mi manca è mantenere la visuale dal panning nel modo in cui mi aspetterei che ciò accada?

MODIFICA: Ho provato ad aggiungere una riga in TestAdjustPanActivity come indicato, che ha causato lo schermo perfettamente su un dispositivo Android 3.2 che ho. Tuttavia, non funziona ancora sul mio dispositivo Android 2.2, il che lo rende ancora più confuso.

risposta

4

Per chiunque inciampo su questo in futuro, ho finito solo utilizzando una finestra di dialogo, invece di un PopupWindow e panning per mantenere il testo in visualizzazione funziona bene su 2.2 con una finestra di dialogo.

0

Si dovrebbe cambiare

android:windowSoftInputMode="stateUnspecified|adjustPan 

a

android:windowSoftInputMode="stateHidden|adjustPan" 
+0

Meh, sfortuna purtroppo. Grazie comunque! – Lewis

3

Non c'è modo più semplice. Basta fornire un layout alternativo per la tastiera attiva.

  1. Fare clic con il tasto sinistro del mouse sul progetto selezionare: "Strumenti Android/Nuovo file di risorse ...".
  2. Scegliere il layout, assegnare il nome del file "main" (non preoccuparti dei conflitti).
  3. Fare clic su "Avanti". Quindi sulla lista a sinistra seleziona "keyboard" e spostalo a destra (fai clic su "->").
  4. Sul lato destro selezionare lo stato della tastiera.
  5. Fine clic.
  6. Ora copia il contenuto del file main.xml che si trova in "res/layout" nel nuovo file in res/layout-keyssoft. "
  7. Correggi il nuovo layout in modo che la tastiera non sia in questo modo. s "ID" per le rispettive componenti in quei due layout (che è il motivo per cui è stato necessario copia incolla).
  8. Godetevi funziona

leggere su configuration changes per capire come funziona. notare che ogni modifica della configurazione (orientamento modifica, cambio lingua, ...) causerà la ricreazione dell'attività (in questo caso l'argomento di onCreate non è nullo) in modo da poter fornire layout diversi per differenti casi ent.

+0

Secondo i documenti Android, questo funziona solo quando la disponibilità effettiva di una tastiera cambia, non per quando è semplicemente mostrata o nascosta, sfortunatamente. Fanno menzione tuttavia della proprietà keyboardHidden della classe Configuration, che darò un'occhiata a. Grazie! – Lewis

1

Dubito che il problema è dovuto al fatto di utilizzare che ScrollView in XML,

C'è stato un altro problema simile a questo, è possibile check all different answers there, e può funzionare per voi.

1

cambiamento questo

android:windowSoftInputMode="stateUnspecified|adjustPan" 

a

android:windowSoftInputMode="adjustPan" 

solo nel file manifest