2011-09-04 16 views
37

Ho visto in alcune applicazioni che il layout cambia quando viene visualizzata la tastiera software. Questo non è certamente lo adjustPan perché l'intero layout (probabilmente il layout interno) cambia, non solo l'attuale EditText. Questo è ad esempio nella schermata di accesso di Evernote. Puoi consigliare come è fatto?Regola il layout quando la tastiera software è attiva

+0

è il tuo problema che il layout sposta verso l'alto quando viene visualizzata la tastiera? –

+1

La domanda è come farlo. – Eugene

+0

Significa che non vuoi che il tuo Layout debba apparire, giusto? –

risposta

66

Ecco una soluzione che funziona come la schermata di login Evernote:

In primo luogo, definire una classe che sarà la vostra LinearLayout speciale come questo:

public class MyLayout extends LinearLayout { 

public MyLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyLayout(Context context) { 
    super(context); 
} 

private OnSoftKeyboardListener onSoftKeyboardListener; 

@Override 
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
    if (onSoftKeyboardListener != null) { 
     final int newSpec = MeasureSpec.getSize(heightMeasureSpec); 
     final int oldSpec = getMeasuredHeight(); 
     if (oldSpec > newSpec){ 
      onSoftKeyboardListener.onShown(); 
     } else { 
      onSoftKeyboardListener.onHidden(); 
     } 
    } 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

public final void setOnSoftKeyboardListener(final OnSoftKeyboardListener listener) { 
    this.onSoftKeyboardListener = listener; 
} 

public interface OnSoftKeyboardListener { 
    public void onShown(); 
    public void onHidden(); 
} 

} 

Questo layout ascolta per misurare i cambiamenti, e se la nuova le misure sono < rispetto a quelle precedenti, il che significa che parte della schermata viene mangiata dalla tastiera virtuale.

Anche se, per funzionare, nel file manifest è necessario impostare android:windowSoftInputMode="adjustResize" in modo che il contenuto venga ridimensionato e non solo spostato.

E tutto il sistema funziona come segue: Hai il layout:

<MyLayout id="layout"> 
    <SomeImage id="image"/> 
    <SomeText> 
    <SomeInput> 
</MyLayout> 

E 'come evernotes schermata di login. Poi, nella vostra attività:

((MyLayout)findViewById(R.id.layout)).setOnSoftKeyboardListener(new OnSoftKeyboardListener() { 
     @Override 
     public void onShown() { 
      findViewById(R.id.image).setVisibility(View.GONE); 
     } 
     @Override 
     public void onHidden() { 
      findViewById(R.id.image).setVisibility(View.VISIBLE); 
     } 
    }); 

Poi vai a manifest.xml e impostare

android:windowSoftInputMode="adjustResize" 

Che cosa succederà, è quando viene mostrato tastiera virtuale, che sarà nascondere l'immagine e ridimensionerà l' resto del contenuto. (Puoi vedere effettivamente come viene ridimensionato il testo in Evernote)

Image hide è, ovviamente, una delle tante cose che puoi fare. Ma devi stare attento, dal momento che diverse modifiche al layout richiederanno anche la misura.

Ovviamente è una variante sporca. È necessario verificare le modifiche all'orientamento e il momento giusto in cui effettivamente si effettuano le misurazioni, e forse un po 'più di logica quando si confrontano le nuove specifiche con quelle vecchie. Ma penso che questo sia l'unico modo per farlo.

+1

Utilizziamo lo stesso approccio nei nostri progetti. Lo odio ma sembra che sia l'unico modo per collegare eventi IME mostrati/nascosti su Android 2.x. – Michael

+4

Questo a volte ha alcuni bug. Questa versione è migliore: http://stackoverflow.com/questions/2150078/android-is-software-keyboard-shown/4737265#4737265 –

+3

Non funziona correttamente su Galaxy S4. Per correggere è necessario modificare if (oldSpec> newSpec) .. else ... per sostituire il 'else' con if (oldSpec

2

Questo ha funzionato per me..Put questa è la tua OnCreate

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
8

Usa "adjustResize" invece di "adjustPan" in AndroidManifest.xml

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

Dal documentation:

"adjustResize"
La finestra principale del attività è sempre ridimensionata per fare spazio per la tastiera virtuale sullo schermo.


finestra principale "adjustPan" del attività non è ridimensionata per fare spazio per la 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

utilizzare la visualizzazione di scorrimento nel layout all'interno del genitore e rimuovere l'impostazione adjustpan o adjustesize dal file manifest. ScrollView sul tuo layout ti darà la funzionalità gratuita per scorrere la panoramica o il layout con il layout specificato e anche proteggere il tuo layout per sovrascrivere la barra degli strumenti o la barra di azione e inoltre non nasconderà i pulsanti oi campi di testo all'interno del layout. Ricorda che devi usare ScrollView all'interno del layout di base, quindi questa scrollview funzionerà come layout di base per l'intero schermo. esempio

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fillViewport="true" 
    android:scrollbarStyle="insideInset" 
    android:scrollbars="vertical" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

     <!-- Add here which you want --> 
    </LinearLayout> 
</ScrollView> 

1

La risposta selezionata non funziona per la modalità a schermo intero. Seguendo una soluzione linea ha lavorato per me:

AndroidBug5497Workaround.assistActivity(this); 

copia della classe AndroidBug5497Workaround da:

Android How to adjust layout in Full Screen Mode when softkeyboard is visible

+0

Grazie, funziona. Nel mio caso un layout è troppo complesso e, dopo un po 'di posizionamento all'interno di un'attività quando appare una tastiera, può bloccarsi (con Memoria esaurita). – CoolMind

Problemi correlati