40

Sto provando a creare una schermata di chat piuttosto semplice con una ListView che mostra il testo e un EditText nella parte inferiore e un pulsante "Invia" a destra di EditText. Tutto è funzionale, ma quando clicco su EditText, la tastiera virtuale lo copre. Lo schermo si apre leggermente ma non abbastanza per essere visibile sopra la tastiera. Ho il tag "adjustPan" nel mio manifest e ho anche provato il tag "adjustResize" senza alcun risultato. Immagino che abbia qualcosa a che fare con il modo in cui il mio layout è impostato, ma onestamente non ne ho idea. Per favore aiuto!adjustPan non impedisce la copertura della tastiera EditText

layout attuale ...

<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> 

risposta

40

Dopo aver fatto un sacco di ricerca a quanto pare è quello che io chiamo un bug. Se si utilizza il tag a schermo intero (per rimuovere la barra di stato dall'attività) non è possibile utilizzare "adjustResize" senza avvolgere l'attività in una ScrollView. Sfortunatamente per me sto usando un ListView che creerebbe ancora un altro problema. Sono stufo di scherzare e probabilmente abbandonerò lo schermo intero su quell'attività.

+0

Grazie! Ho salvato la mia giornata! Ho avuto un campo di input webview sovrapposto alla tastiera. Rimozione a schermo intero risolto. – tarkeshwar

+2

Grazie! Ho avuto lo stesso problema, ma mettere tutto all'interno di una scrollView non ha risolto il problema. Quindi sembra che rimuovere la flag a schermo intero sia l'unico modo per sbarazzarsi di questo bug. – yahya

+0

controlla la semplice risposta di @usman di seguito. Funziona a schermo intero – usman

0

Ecco una soluzione che ho trovato. Apri il problemText editText e premi il tasto RETURN. Notate che sposta il testo di modifica più vicino alla posizione per cui state girando.

Quindi, anche se è un hacker, puoi essenzialmente fare una nuova riga all'inizio dell'editor.

Anche questo sembra funzionare con una nuova riga in basso, ma è necessario utilizzare un ritardo per non aggiungere la nuova riga fino a quando la tastiera virtuale non si è animata in posizione.

Nota Ho solo questo problema su alcuni telefoni (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()); 
       } 
      }); 
     } 
24

Nel file manifest, è necessario impostare la android:windowSoftInputMode proprietà appropriata. Questo attributo è valido poiché API 3.

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

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

  • stateUnspecified Lo stato della tastiera molle (se è nascosto o visibile) non è specificato. Il sistema sceglierà uno stato appropriato o si baserà sull'impostazione del tema. Questa è l'impostazione predefinita per il comportamento della tastiera virtuale.
  • stateUnchanged La tastiera virtuale viene mantenuta nello stato in cui era l'ultima volta, visibile o nascosta, quando l'attività viene a galla.
  • "stateHidden" La tastiera virtuale viene nascosta quando l'utente sceglie l'attività, ovvero quando l'utente naviga in modo affermativo verso l'attività, anziché tornare indietro per lasciare un'altra attività.
  • stateAlwaysHidden La tastiera virtuale è sempre nascosta quando la finestra principale dell'attività ha il focus di input.
  • stateVisible La tastiera virtuale è visibile quando è normalmente appropriata (quando l'utente sta navigando in avanti fino alla finestra principale dell'attività).
  • stateAlwaysVisible La tastiera virtuale è resa visibile quando l'utente sceglie l'attività, ovvero quando l'utente naviga affermativamente verso l'attività, anziché tornare indietro a causa di lasciare un'altra attività.
  • adjustUnspecified Non è specificato se la finestra principale dell'attività viene ridimensionata per lasciare spazio alla tastiera virtuale o se il contenuto del riquadro della finestra consente di rendere visibile sullo schermo il fuoco corrente. Il sistema selezionerà automaticamente una di queste modalità a seconda che il contenuto della finestra abbia una vista di layout in grado di scorrere il loro contenuto. Se c'è una tale vista, la finestra verrà ridimensionata, partendo dal presupposto che lo scrolling può rendere visibili tutti i contenuti della finestra all'interno di un'area più piccola. Questa è l'impostazione predefinita per il comportamento della finestra principale.
  • adjustResize La finestra principale dell'attività viene sempre ridimensionata per lasciare spazio alla tastiera virtuale sullo schermo.
  • adjustPan La finestra principale dell'attività non viene ridimensionata per lasciare spazio alla tastiera virtuale. Piuttosto, il contenuto della finestra viene automaticamente spostato in modo che la messa a fuoco corrente non sia mai oscurata dalla tastiera e gli utenti possano sempre vedere che cosa stanno digitando. Questo è generalmente meno desiderabile del ridimensionamento, poiché l'utente potrebbe dover chiudere la tastiera virtuale per accedere e interagire con le parti oscurate della finestra.
+0

questo ha funzionato per me. non mettere la finestra SoftInputMode nel layout. dal momento che sto già dichiarando android: fitsSystemWindows = "true" in un'altra vista, non posso metterlo dove deve andare nel layout per funzionare. Grazie! – styler1972

1

Ho avuto questo nel mio AndroidManifest. Ha causato il adjustPan smettere di funzionare correttamente. Ho rimosso il blocco sottostante e tutto funziona di nuovo bene.

<supports-screens 
     android:smallScreens="true" 
     android:normalScreens="true" 
     android:largeScreens="true" 
     android:xlargeScreens="false" 
     android:anyDensity="false" /> 
+0

Ho capito e sto cercando di rimuoverlo ma non so da dove viene generato. Il mio file config.xml non ha alcun riferimento a questo –

+0

Sono passati un paio d'anni da quando ho avuto questo problema, ma penso che il codice sopra fosse nel mio file AndroidManifest.xml. – JeffRegan

+0

Non riesco a modificare questo file, ho bisogno di cambiare il config.xml che genera l'altro ma non ho questo su di esso. Ma in ogni caso. rimuovere questo da AndroidManifest.xml non ha funzionato, ma non preoccuparti, questo è abbastanza vecchio ora –

1

Prova ad aggiungere android:windowSoftInputMode="adjustResize|stateVisible|stateAlwaysHidden" nel file manifest.

-8

è possibile provare le seguenti impostazioni:

<supports-screens 
android:anyDensity="true"/> 
+0

risposta sbagliata. Si prega di rettificare questa risposta. –

7

se si imposta android:windowSoftInputMode="adjustResize" per un'attività nel manifesto, poi uno ScrollView (o altri ViewGroups schiacciabili) si ridurrà per ospitare la tastiera virtuale. Ma se imposti lo android:windowFullscreen="true" nel tema dell'attività, ScrollView non si restringerà perché è costretto a riempire l'intero schermo. Tuttavia, l'impostazione di android:fitsSystemWindows="false" nel tema causa inoltre che AdjustResize non funzioni

+0

Pollice in alto per molti chiarimenti Mi stavo sbattendo la testa da alcuni giorni perché stavo usando fullscreen per la mia applicazione grazie –

Problemi correlati