2017-12-18 3 views
4

Es gibt viele (doppelte) Fragen und Antworten zur Verfügung, ich ging fast alle von ihnen und scheiterte. Auf Anfrage von this Frage habe ich kürzlich einige Änderungen vorgenommen.Listen DialogFragment entlassen Ereignis von ViewPager Fragment

Kurz: MainActivity enthält in der App Fragment View Pager und FrangementA, B und C. FrangementA zeigt einen DialogFragment CDialog onClik. Nachdem ich CDialog abgelehnt habe, muss ich FragmentRoad() aufrufen, was hier nicht passiert.

MainActivity

protected void onCreate(Bundle savedInstanceState){ 
          ... 

      mSectionsPageAdapter = new FragmentAdapter(getSupportFragmentManager()); 
      mViewPager = (ViewPager) findViewById(R.id.container); 
      setupViewPager(mViewPager); 
      TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
      tabLayout.setupWithViewPager(mViewPager); 
      int defaultValue = 0; 
      int page = getIntent().getIntExtra("One", defaultValue); 
      mViewPager.setCurrentItem(page); 
    } 

    private void setupViewPager(ViewPager viewPager) 
     { 
      FragmentAdapter adapter = new 
      FragmentAdapter(getSupportFragmentManager()); 
      adapter.addFragment(new FragmentA(), "FragA"); 
      adapter.addFragment(new FragmentB(), "FragB"); 
      adapter.addFragment(new FragmentC(), "FragC"); 
      viewPager.setAdapter(adapter); 
     } 

fragmenta

public class FragmentA extends Fragment implements CDialog.Dismissed{ 
    @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    ... 
    button.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
        FragmentManager fm = getActivity().getFragmentManager(); 
        DialogFragment f = new CDialog(); 
        f.show(fm, "CDialog"); 
        } 
      }); 

@Override 
    public void dialogDismissed() { 
     Log.e(DFD_1, "dialogDismiss Called");// <-- This is not working* 
     doReload(); 
    } 
    } 

Und CDialogue

public class CDialog extends DialogFragment{ 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
            .... 
         return v; 
    } 
    @Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
      ... 

      dfd_1.setOnClickListener(
      new View.OnClickListener() { 
       public void onClick(View v) { 
         getDialog().dismiss(); //<--when this happens* 
        } 
      }); 

} 
    @Override 
     public void onDismiss(DialogInterface dialog) { 
      if (getActivity() != null && getActivity() instanceof Dismissed) { 
       ((Dismissed) getActivity()).dialogDismissed(); 
      } 
      super.onDismiss(dialog); 
     } 

     public interface Dismissed { 
      public void dialogDismissed(); //<-- FragmentA implements this 
     } 
} 
+1

In CDialogs onDismiss() scheinst du den Dismissed Callback auf deiner Aktivität auszulösen und nicht dein Fragment A. Also nimm entweder einen Verweis auf das Fragment, auf dem du doReload aufrufen willst oder behalte den aktuelle Implementierung, aber die Aktivität rufen Sie die DoReleaod-Methode auf Fragment A. – Luksprog

Antwort

3

können Sie haben immer direkten Rückruf an Ihrem Fragment selbst.

ersten Schritt wird targetFragment einzustellen setTargetFragment() Verwendung:

DialogFragment#setTargetFragment(Fragment fragment, int requestCode); 

ich es auf diese Weise:

public void showDialogFragment(Fragment targetFragment, AppCompatDialogFragment appCompatDialogFragment, int requestCode) { 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    appCompatDialogFragment.setTargetFragment(targetFragment, requestCode); 
    fragmentTransaction.add(appCompatDialogFragment, appCompatDialogFragment.getClass().getSimpleName()); 
    fragmentTransaction.commitAllowingStateLoss(); 
} 

und dann auf diese Methode aufrufen Dialog Fragment zu öffnen:

public static final int RC_CDIALOG = 111; 

button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       showDialogFragment(FragmentA.this, new CDialog(), RC_CDIALOG); 
      } 
     }); 

Dann haben Sie in Ihrem DialogFragment onDismissListener() einige Kabeljau E wie unten:

@Override 
public void onDismiss(DialogInterface dialog) { 
    super.onDismiss(dialog); 

    if (getTargetFragment() instanceof FragmentA) 
     ((FragmentA) getTargetFragment()).doReload(); 

} 

Was Sie auf diese Weise tat, ist:

Dialog anzeigen Fragment „CDialog“ zusammen mit ihm zu sagen, dass Ihre Zielfragment „fragmenta“ Referenz dessen können Sie einhüllen verwenden Sie etwas damit zu tun haben. In deinem Fall musstest du doReload();

anrufen