2016-04-20 12 views
0

Ich habe Elternfragment und Dialogfragment in meiner Anwendung. Wenn Sie auf eine Schaltfläche klicken, öffnet Parent Fragment Dialog Fragment. Dies ist meine ParentFragment-Klasse.getTargetFragment Rückgabe Null

public class ParentFragment extends Fragment { 
........ 
........ 
    public class ButtonClickListener implements View.OnClickListener{ 
     @Override 
     public void onClick(View v) { 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      Fragment prev = getFragmentManager().findFragmentByTag("dialog"); 
      if (prev != null) { 
       ft.remove(prev); 
      } 
      MyDialogFragment newFragment = new MyDialogFragment(); 
      newFragment.setTargetFragment(ParentFragment.this, 0); 
      newFragment.show(getFragmentManager(), "dialog"); 
     } 
    } 

} 

Dies ist MyDialogFragment Klasse

public class MyDialogFragment extends DialogFragment { 
.......... 
public MyDialogFragment() { 
      parentFragment = (ParentFragment)getTargetFragment(); 

     } 
........... 
........... 
} 

Wenn getTargetFragment in MyDialogFragment Klasse immer null zurück.

+0

Versuchen Sie es mit indFragmentByTag wie 'getFragmentManager(). FindFragmentByTag (parentFragmentTag);' –

Antwort

2

überprüfen Sie Ihre Sequenz von

Befehle
MyDialogFragment newFragment = new MyDialogFragment(); // line 1 
newFragment.setTargetFragment(ParentFragment.this, 0); // line 2 

hier werden Sie zunächst ein neues MyDialogFragment Objekt erstellen. Denken Sie daran, dass dieser Befehl (Zeile 1) den Konstruktor von MyDialogFragment aufruft. Danach setzen Sie das Zielfragment (Zeile 2).

Wenn Sie an Ihrem dialogFragment aussehen,

public MyDialogFragment() { 
      parentFragment = (ParentFragment)getTargetFragment();  
} 

Sie versuchen, Zielfragment im Konstruktor zugreifen. Also wird das Zielfragment immer null sein, weil Sie es assignieren, nachdem der Konstruktor in Zeile 2 aufgerufen wurde. Versuchen Sie, es von einer anderen Methode aus aufzurufen oder übergeben Sie es als Parameter an den Konstruktor (was keine gute Übung ist).

0

Das Problem ist, dass Sie keinen Verweis auf das ParentFragment haben, da getTargetFragment() null ist. Sie können das Fragment aber auch auf andere Weise mit den getFragmentById() - oder getFragmentByTag() -Methoden des FragmentManager abrufen.

0

setTargetFragment() und getTargetFragment, sind nicht einfach Getter und Setter, ersetzen sie Anrufe wie:

parentFragment.getFragmentManager().putFragment(args, "bla bla tag", (Fragment)parentfragment); 

die hinter setTargetFragment() ist, wo args das Argument zu dem Dialogfragment festgelegt werden.

und

getFragmentManager().getFragment(getArguments(), "bla bla tag"); 

die hinter getTargetFragment ist(). Wie Sie sehen können, beinhaltet diese Logik Fragmentlebenszyklen, nicht nur das Setzen und Abrufen einer Variablen.

Kurz gesagt, wenn Sie das Zielfragment erhalten wollen, tun Sie es einfach in onCreateDialog() oder in onCreate(), Methoden von DialogFragment, die Argumente sind dort bereits gesetzt, also sollte getTargetFragment() nicht null sein . :)

Verwandte Themen