2013-06-21 6 views
34

Ich habe ein Problem mit meinem DialogFragment. Um meine Ansicht zu erstellen, verwende ich die Methode, die auf dem Android-Blog beschrieben wird. Hier ist meine DialogFragmentDialogFragment und zwingen, Tastatur zu zeigen

@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; 
} 

Wenn ich onCreateView() verwenden, es funktioniert, aber ich würde eine AlterDialog gerne schaffen und dies zu tun, ich habe den folgenden Code:

@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(); 
} 

Wenn ich kommentieren die Code von onCreateView(), funktioniert die App, aber ich kann nicht erzwingen, dass die Tastatur angezeigt wird, und wenn ich onCreateView() auskommentieren, bekomme ich einen Absturz. Hier ist der Stack-Trace:

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 

Also meine Frage ==> Kann ich das Alertdialog verwenden und die Tastatur zeigen, wenn das Dialogfeld angezeigt wird?

Antwort

95

Überschreibung onActivityCreated in Ihrem dialogfragment und setzen getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); dort

+3

wtf?! Ich habe so viel Zeit gesucht und die Lösung war so einfach! Aber eins verstehe ich nicht. Ich habe versucht, Android: windowSoftInputMode = "stateVisible" im Manifest über die Aktivität, die verantwortlich für den Start des Dialogs verantwortlich ist und es funktioniert nicht ... – mrroboaat

+0

Vielen Dank !! Es gibt ungefähr ein Dutzend andere "Lösungen" für dieses Problem auf StackOverflow und keiner von ihnen funktioniert für mich ... aber dieser tut es. – josh2112

+0

Dies scheint die funktionierendste Lösung unter allen, die ich finden kann. Ich bin neugierig, warum dies in onActivityCreated statt onResume() aufgerufen werden muss? Ich liebe wirklich einige Erklärungen zu hören. – Sean

12

Die Antwort von tyczj nicht für mich arbeiten.

Die Lösung wurde innerhalb onCreateDialog

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

Am Ende würde der Code wie folgt sein

@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

für den setLayout() Anruf Pass auf, wenn Sie es verwenden. Es dauerte eine Weile, bis ich erkannte, dass es die Attribute Ihres Fensters außer Kraft setzen könnte. Nach dem Einwickeln in einen Handler funktionierte die akzeptierte Lösung für mich.

@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

einfach perfekt !. 'setLayout()' erzeugte das Problem –

4

Verwenden "SOFT_INPUT_STATE_ALWAYS_VISIBLE" anstelle von "SOFT_INPUT_STATE_VISIBLE" entweder in onActivityCreated oder onCreateDialog Methode.

+0

Dies war die Lösung für mich kombiniert mit Purgarcita Lösung in onCreateDialog am Ende. – user960914

Verwandte Themen