有很多(重复的)问题和答案可用,我经历了几乎所有的问题并且失败了.在参考this问题时,我最近做了一些改变.
简介:在我的应用程序中,MainActivity持有Fragment VIEw Pager和FrangmentA,B和C. FrangmentA在Clik上显示DialogFragment CDialog.在解雇CDialog后,我需要调用FragmentA的doReload(),这不会发生在这里.
主要活动
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(); } }
和CDialogue
public class CDialog extends DialogFragment{@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { .... return v; } @OverrIDepublic 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 }}
解决方法:
您可以随时直接回调Fragment本身.
第一步,使用setTargetFragment()设置targetFragment:
DialogFragment#setTargetFragment(Fragment fragment, int requestCode);
我是这样做的:
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();}
然后调用此方法打开对话框片段:
public static final int RC_CDIALOG = 111;button.setonClickListener(new VIEw.OnClickListener() { public voID onClick(VIEw vIEw) { showDialogFragment(FragmentA.this, new CDialog(), RC_CDIALOG); } });
然后,在DialogFragment的ondismissListener()中,有一些代码如下:
@OverrIDepublic voID ondismiss(DialogInterface dialog) { super.ondismiss(dialog); if (getTargetFragment() instanceof FragmentA) ((FragmentA) getTargetFragment()).doReload();}
你这样做的是:
显示Dialog片段“CDialog”并告诉它你的目标片段是“FragmentA”,你可以使用它的引用,因为你有与它有关的事情.在你的情况下你必须调用doReload();
总结以上是内存溢出为你收集整理的java – 从ViewPager Fragment中侦听DialogFragment事件全部内容,希望文章能够帮你解决java – 从ViewPager Fragment中侦听DialogFragment事件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)