2016-08-09 18 views
0

Ich habe diese android.app.DialogFragment:Unerwartetes Verhalten Erstellen DialogFragment Instanz

public class MyDialog extends DialogFragment { 

    private Callback callback; 

    public static MyDialog newInstance() { 
     return new MyDialog(); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog dialog = new AlertDialog.Builder(getActivity()) 
      //set more things 
      .setPositiveButton("Ok", new DialogInterface.OnClickListener(){ 
       callback.run(); //callback is null   
      }).create(); 
     return dialog; 
    } 

    public void setCallback(Callback callback) { this.callback = callback; } 

} 

und aus meiner Tätigkeit:

MyDialog dialog = MyDialog.newInstance(); 
dialog.setCallback(myCallback); 
dialog.show(getFragmentManager(), "dialog"); 

Aber wenn ich "Ok" klicken, stürzt beacuse Rückruf null ist. myCallback ist nie null

Ich habe etwas gefunden. onCreateDialog zweimal und das zweite Mal genannt callback ist null:

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Log.d("test", "onCreateDialog (" + this + ") -> " + callback); 
     //more code 
    } 

Er druckt:

onCreateDialog (MyDialog {18ea188e}) -> [email protected]

onCreateDialog (MyDialog {22199eaa}) -> null

Wie ist es möglich? Warum gibt es zwei verschiedene Instanzen? Warum wird onCreateDialog zweimal angerufen?

+0

können Sie Beiträge verfassen einen Stacktrace oder geben Sie die Zeile, in der die App abstürzt? –

+0

Es stürzt in der 'callback.run()' Zeile in der Schaltfläche Listener ab. –

+0

versuche Callback öffentlich zu machen und auch diese.callback.run(); – Nivedh

Antwort

0

Ich weiß nicht, was passiert ist, aber ich habe indem callback eine statisch gelöst :

privater statischer Rückruf Rückruf;

public static MyDialog newInstance(Callback callback) { 
    MyDialog.callback = callback;  
    return new MyDialog(); 
} 

Es ist eine hässliche Lösung ... naja ...

1

Ich denke, Sie den Rückruf einstellen sollten, wie Sie mit einem normalen Fragment würde, setzen Sie es in onAttach(Context context) und entfernen Sie sie in onDetach()