java – 从ViewPager Fragment中侦听DialogFragment事件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 从ViewPager Fragment中侦听DialogFragment事件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3523字,纯文字阅读大概需要6分钟。
内容图文
![java – 从ViewPager Fragment中侦听DialogFragment事件](/upload/InfoBanner/zyjiaocheng/789/6cc21dc5b41a459d94ec4a046b15f860.jpg)
有很多(重复的)问题和答案可用,我经历了几乎所有的问题并且失败了.在参考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();
内容总结
以上是互联网集市为您收集整理的java – 从ViewPager Fragment中侦听DialogFragment事件全部内容,希望文章能够帮你解决java – 从ViewPager Fragment中侦听DialogFragment事件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。