2016-08-12 18 views
1

Ist das möglich? Ich habe mit onAttach die Standardmethode von Fragment-Aktivität Kommunikation mit() und ich frage mich, ob etwas getan werden kann:Fragment zu Aktivität Kommunikation über anonyme Schnittstelle

MainActivity.java

// Create Dialog passing in callback 
MyDialogFragment dialog = MyDialogFragment.newInstance(param, new MyDialogInterface) { 
     @Override 
     public void onSelected(DialogFragment dialog, String result) { 

     } 

     @Override 
     public void onNotSelected(DialogFragment dialog) { 

     } 
    } 

MyDialogFragment.java

// Execute callback 
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       myInterface.onNotSelected(MyDialogFragment.this); 
      } 
     }) 
     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       myInterface.onSelected(MyDialogFragment.this, "WORKED"); 
      } 
     }); 

Dies würde mir erlauben, einen linearen Logikfluss in dem Code zu erhalten, in dem der Dialog angezeigt wird, im Gegensatz zum Hinzufügen zusätzlicher Schnittstelle meth ods zur Aktivität.

Antwort

1

Dies könnte eine große Lösung sein, aber da Activity und Fragment können von einem gespeicherten Zustand, diese Regelung nicht zuverlässig zerstört und neu erstellt ist - nach Fragment ‚s Neuschöpfung es innen an den Rückruf keinen Hinweis wird die Fragment.

Das Standardschema, an denen in onAttach() von Activity in Callback-Schnittstelle Gießen verwendet werden soll, weil onAttach()-Activity umschließenden nach Fragment ‚s Neuschöpfung mit Nicht-Null-Referenz genannt werden gewährleistet. Dies ist sehr unpraktisch, aber dies ist die Einschränkung, die durch das Android Framework selbst auferlegt wird.

Umgehung nicht Schnittstellen und Gießen beteiligt: ​​

ich viele Variationen von „Interface-and-Casting“ Ansatz, den Sie möchten, zu vermeiden versucht, und alle von ihnen in der Tat schmutzig und umständlich fühlte daher heutzutage verwende ich EventBus, um -zu-Activity Kommunikation zu unterstützen. Das allgemeine Schema ist so etwas wie diese (nur relevanten Teile dargestellt):

Aktivität:

public class DemoActivity extends Activity { 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     EventBus.getDefault().unregister(this); 
    } 

    @Subscribe 
    public void onDemoFragmentEvent(DemoFragment.DemoFragmentCallbackEvent event) { 
     Toast.makeText(this, "Event in Fragment happened: " + event.getWhatHappened(), Toast.LENGTH_LONG).show(); 
    } 
} 

Fragment:

public class DemoFragment extends Fragment { 

    /** 
    * Objects of this class will be posted on EventBus if anything happens in this Fragment 
    */ 
    public static class DemoFragmentCallbackEvent { 

     private String mWhatHappened; 

     public DemoFragmentCallbackEvent(String whatHappened) { 
      mWhatHappened = whatHappened; 
     } 

     public String getWhatHappened() { 
      return mWhatHappened; 
     } 
    } 

    public void somethingHappened() { 
     EventBus.getDefault().post(new DemoFragmentCallbackEvent("no interfaces and casting")); 
    } 

} 
+0

hat das Gefühl, dass dies der Fall wäre. Ich fragte mich, ob es einen cleveren Hack gab, mit dem jemand aufwarten konnte. Wäre sehr praktisch! – Ron

+0

@Ron, wenn Sie offen für "clevere Hacks" sind, dann sollten Sie vielleicht den Ansatz versuchen, den ich mit EventBus verwende. Siehe die bearbeitete Antwort. – Vasiliy

Verwandte Themen