java – 从ViewPager Fragment中侦听DialogFragment事件

有很多(重复的)问题和答案可用,我经历了几乎所有的问题并且失败了.在参考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{

@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 
        }
}

解决方法:

您可以随时直接回调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()中,有一些代码如下:

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

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

}

你这样做的是:

显示Dialog片段“CDialog”并告诉它你的目标片段是“FragmentA”,你可以使用它的引用,因为你有与它有关的事情.在你的情况下你必须调用doReload();

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...