2013-06-21 17 views
34

Ho un problema con il mio DialogFragment. Quindi, per creare il mio punto di vista, io uso il metodo descritto sul blog di Android. Ecco il mio DialogFragmentDialogFragment e force to show keyboard

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View myLayout = inflater.inflate(R.layout.dialog_connect, null); 

    edit = (EditText) myLayout.findViewById(R.id.password_edit); 
    edit.requestFocus(); 
    getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

    return myLayout; 
} 

Se uso onCreateView(), funziona, ma mi piacerebbe creare un AlterDialog e per fare questo, ho il seguente codice:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    // Inflate and set the layout for the dialog 
    // Pass null as the parent view because its going in the dialog layout 
    builder 
      .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        callback.onYesConnectClick(edit.getText().toString()); 
       } 
      }) 
      .setNegativeButton(R.string.refuse, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        callback.onNoConnectClick(); 
       } 
      }); 

    return builder.create(); 
} 

Se io commento la codice da onCreateView(), l'app funziona ma non riesco a forzare la visualizzazione della tastiera e se rendo un commento a onCreateView(), si verifica un arresto anomalo. Ecco la traccia dello stack:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test/com.test.ProfileActivity_}: android.util.AndroidRuntimeException:  requestFeature() must be called before adding content 
AndroidRuntime at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2312) 
AndroidRuntime at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2362) 
AndroidRuntime at android.app.ActivityThread.access$600(ActivityThread.java:156) 
AndroidRuntime at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1250) 
AndroidRuntime at android.os.Handler.dispatchMessage(Handler.java:99) 
AndroidRuntime at android.os.Looper.loop(Looper.java:137) 
AndroidRuntime at android.app.ActivityThread.main(ActivityThread.java:5229) 
AndroidRuntime at java.lang.reflect.Method.invokeNative(Native Method) 
AndroidRuntime at java.lang.reflect.Method.invoke(Method.java:525) 
AndroidRuntime at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799) 
AndroidRuntime at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
AndroidRuntime at dalvik.system.NativeStart.main(Native Method) 
AndroidRuntime Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content 

Quindi la mia domanda ==> Posso usare l'AlertDialog e visualizzare la tastiera quando viene visualizzata la finestra di dialogo?

risposta

95

esclusione onActivityCreated nel vostro dialogfragment e mettere getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); in là

+3

wtf?! Ho cercato così tanto tempo e la soluzione è stata così facile! Eppure, c'è una cosa che non capisco. Ho provato a impostare android: windowSoftInputMode = "stateVisible" nel manifest sull'attività che è responsabile dell'avvio della finestra di dialogo e non funziona ... – mrroboaat

+0

Grazie !! Ci sono circa una dozzina di altre "soluzioni" a questo problema su StackOverflow e nessuno di loro funziona per me ... ma questo sì. – josh2112

+0

Questa sembra la soluzione più funzionante tra tutte quelle che riesco a trovare. Sono curioso perché questo deve essere chiamato inActivityCreated, invece di onResume()? Mi piace molto ascoltare alcune spiegazioni. – Sean

12

La risposta di tyczj non funziona per me.

La soluzione è stata, all'interno onCreateDialog

Dialog d = builder.create(); 
d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
return d; 

Alla fine, il codice sarebbe stato così

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    // Inflate and set the layout for the dialog 
    // Pass null as the parent view because its going in the dialog layout 
    builder 
      .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        callback.onYesConnectClick(edit.getText().toString()); 
       } 
      }) 
      .setNegativeButton(R.string.refuse, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        callback.onNoConnectClick(); 
       } 
      }); 

    Dialog d = builder.create(); 
     d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
return d; 
} 
2

Attenzione per la chiamata setLayout() se lo si utilizza. Mi ci è voluto un po 'per capire che potrebbe ignorare gli attributi della tua finestra. Dopo averlo confezionato in un gestore, la soluzione accettata ha funzionato per me.

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final Dialog dialog = super.onCreateDialog(savedInstanceState); 
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 

    return dialog; 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    // without a handler, the window sizes itself correctly 
    // but the keyboard does not show up 
    new Handler().post(new Runnable() { 
     @Override 
     public void run() { 
      getDialog().getWindow().setLayout(DIALOG_WIDTH, DIALOG_HEIGHT); 
     } 
    }); 
} 
+0

semplicemente perfetto !. 'setLayout()' stava creando il problema –

4

Uso "SOFT_INPUT_STATE_ALWAYS_VISIBLE" anziché "SOFT_INPUT_STATE_VISIBLE" sia in onActivityCreated o onCreateDialog metodo.

+0

Questa era la soluzione per me combinata con la soluzione Purgarcita in onCreateDialog alla fine. – user960914