5

Sono di fronte a un problema con AlertDialog e contenuto/vista personalizzati. Semplicemente detto che AlertDialog non si ridimensiona automaticamente quando viene aperta la softkeyboard. I seguenti screenshot mostrano meglio ciò che il mio problema è e ciò che voglio raggiungere:AlertDialog con visualizzazione personalizzata non "ridimensiona"

comportamento corrente (a sinistra) & voluto comportamento (a destra)

Current behaviorwanted behavior

io vi conosco alcuni altri thread con problema simile su SO. Sfortunatamente nessuna delle soluzioni fornite ha funzionato per me. In seguito il mio codice di esempio:

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="wrap_content" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <EditText 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 
     </EditText> 
    </LinearLayout> 

</ScrollView> 

Java - CustomAlertDialog.class

public class CustomAlertDialog extends AlertDialog{ 

    private Context context; 

    public CustomAlertDialog(Context context) { 
     super(context); 
     this.context = context; 
    } 

    public void buildDialog(){ 
     LayoutInflater inflater = getLayoutInflater(); 
     View layout = inflater.inflate(R.layout.dialog_content, null); 
     builder = new AlertDialog.Builder(context); 
     builder.setTitle("EditText"); 
     builder.setView(layout); 
     builder.setPositiveButton("Ok", new OnClickListener() { 

      @Override 
      public void onClick(DialogInterface arg0, int arg1) { 
       dismiss(); 
      } 
     }); 
     builder.create(); 
    } 

    public void showDialog(){ 
     builder.show(); 
    } 
} 

La classe/funzione di cui sopra viene chiamato su un premere il pulsante nella mia classe Main.java

btnAlertDialog.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      CustomAlertDialog dialog = new CustomAlertDialog(Main.this); 
      dialog.buildDialog(); 
      dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
      dialog.showDialog(); 
     } 
    }); 

Ho provato le seguenti cose:

Aggiunta di barre di scorrimento al LinearLayout come questo

android:scrollbars="vertical" 
android:scrollbarAlwaysDrawVerticalTrack="true" 

Risultato: nulla è cambiato

Impostazione di una bandiera per la finestra di dialogo:

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 

Risultato: niente cambiato

L'applicazione di un CUSTOM- stile per AlertDialog:

<style name="AlertDialog" parent="@android:style/Theme.Holo.Light"> 
     <item name="android:windowFullscreen">false</item> 
</style> 

Java

builder = new AlertDialog.Builder(context, R.style.AlertDialog); 

Questo ha funzionato. Purtroppo ha prodotto alcuni problemi che si può vedere il nel seguente screenshot

Custom style - new problem

Apprezzo tutto l'aiuto da quando sono stato alle prese con questo problema per giorni. Grazie!

Soluzione

Ora sto utilizzando il seguente metodo per creare la finestra nella mia CustomAlertDialog.class. Vedere il mio commento sotto la risposta di nandeesh per ulteriori dettagli sul motivo per cui non ha funzionato prima.

public void startDialog(){ 
     LayoutInflater inflater = getLayoutInflater(); 
     View layout = inflater.inflate(R.layout.dialog_content, null); 
     builder = new AlertDialog.Builder(context); 
     builder.setTitle("EditText"); 
     builder.setView(layout); 
     builder.setPositiveButton("Ok", new OnClickListener() { 

      @Override 
      public void onClick(DialogInterface arg0, int arg1) { 
       dismiss(); 
      } 
     }); 
     AlertDialog aDialog = builder.create(); 
     aDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
     aDialog.show(); 
    } 
+0

pesi di layout uso . non corrisponde al genitore – Doomsknight

+0

match_parent è perfettamente adatto per la larghezza. Inoltre, non è possibile attribuire un peso a un singolo LinearLayout. – reVerse

+0

bene in pratica i pulsanti non verranno visualizzati perché si sta utilizzando la visualizzazione personalizzata per la finestra di dialogo. e dopo aver dato il tema specifico il pulsante ha mostrato. userei anche i pulsanti personalizzati se avessi creato una visualizzazione personalizzata per la finestra di dialogo. – k0sh

risposta

6

io non sono sicuro di dove avete fatto l'setSoftInputmode ma invece di

builder.show(); 

uso

AlertDialog mDialog = builder.create(); 
mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
mDialog.show(); 

Se questo non funziona, allora fai inviare classe CustomAlertDialog

+0

Awesome, ora funziona. Ho modificato la mia domanda con il codice completo del mio 'CustomAlertDialog.class'. Sembra che il problema era che non ho mai creato un AlertDialog in modo esplicito. Quindi, quando ho impostato la bandiera nel mio Main.class non ha avuto alcun effetto in quanto la finestra di dialogo visualizzata non era la finestra di dialogo del mio 'Main.class' ma del costruttore. Adesso imposto il flag nella classe CustomAlertDialog e creo esplicitamente un AlertDialog e funziona. Grazie ancora, mi hai portato alla soluzione. – reVerse

0

Chiaramente questo problema non ha nulla a che fare con il modo il dialogo è costruito, se si utilizza una visualizzazione personalizzata, ecc, il problema è windowSoftInputMode.

Cambiare la finestra SoftInputMode in AndroidManifest.xml per l'attività oltre a modificarlo per la finestra dovrebbe fare il trucco.

Assicurarsi che la vista nella finestra di dialogo sia una vista a scorrimento.

+0

L'applicazione di 'android: windowSoftInputMode =" adjustResize "' alla mia attività non fa il trucco, ho anche provato questo prima e secondo il manuale di riferimento questo influenzerà solo la finestra principale. Inoltre: Come puoi vedere nel mio codice xml c'è una scrollview e funziona senza problemi se ci sono più file di quelle che si adattano allo schermo intero < – reVerse