java– 从ViewPager Fragment中侦听DialogFragment事件

java– 从ViewPager Fragment中侦听DialogFragment事件,第1张

概述有很多(重复的)问题和答案可用,我经历了几乎所有的问题并且失败了.在参考this问题时,我最近做了一些改变.简介:在我的应用程序中,MainActivity持有FragmentViewPager和FrangmentA,B和C.FrangmentA在Clik上显示DialogFragmentCDialog.在解雇CDialog后,我需要调用FragmentA的doRe

有很多(重复的)问题和答案可用,我经历了几乎所有的问题并且失败了.在参考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事件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1119628.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存