从父片段调用方法
Posted
技术标签:
【中文标题】从父片段调用方法【英文标题】:Invoking a method from parent fragment 【发布时间】:2016-07-17 19:37:49 【问题描述】:通常,我可以从Activity
调用扩展DialogFragment
并实现DialogInterface.OnClickListener()
的对象。
然后,如果我想从 Dialog
调用父活动中的方法,我可以执行 ((NameOfParentActivity)getActivity()).nameOfMethod();
但现在我从Fragment
(特别是ViewPager
的页面)而不是Activity
调用这样的对象。
我不确定要更改什么才能使方法调用行正常工作。换句话说,我试图从 Fragment
类中调用一个方法,同时在其 DialogFragment
对象中。
编辑:OnClick()
代码来自我的Adapter
类:
public void onClick(View v)
DeleteGameBoardDialogFragment dialogFragment = new DeleteGameBoardDialogFragment();
Bundle args = new Bundle();
args.putString(TabFragmentGameBoard.GAMEBOARD_DIALOG_TAG, mGameBoards.get(position).getGameBoardName());
dialogFragment.setArguments(args);
dialogFragment.show(((Activity) mContext).getFragmentManager(), "");
【问题讨论】:
【参考方案1】:您可以使用setTargetFragment() 和getParentFragment() 解决您的对话片段问题。
从您的 ViewPager 片段 调用对话框,您希望在其中执行片段方法。
DeleteGameBoardDialogFragment dialogFragment = new DeleteGameBoardDialogFragment();
dialogFragment.setTargetFragment(this,1);
FragmentTransaction transaction=getChildFragmentManager().beginTransaction();//must be getChildFragmentManager()
dialogFragment.show(transaction, "df");
在您的DeleteGameBoardDialogFragment
中,调用以下代码
DeleteGameBoardDialogFragment fragment=(DeleteGameBoardDialogFragment) getParentFragment();
fragment.nameOfMethod()
IMPT:确保您只从片段而不是从活动中调用对话框。 为什么如果您从活动getParentFragment()
调用返回null
。
getParentFragment () :返回包含此 Fragment 的父 Fragment。如果这个Fragment直接附加到一个Activity,返回null..更多访问SO : getParentFragment returning null
【讨论】:
嗨@Bharatesh 在mainfragment 中调用setTargetFragment
后,当我调用它((MainFragment)getTargetFragment()).method();
时它正在工作。这是一个好方法吗
@a2en 没问题.. 唯一的区别是我创建了一个对象并调用了一个方法,而您没有.. 但是它是您的调用方式。代码可读性很重要。
但是你打电话给getParentFragment();
而我打电话给getTargetFragment
我错过了...请查看官方文档中getParentFragment() 和getTargetFragment() 之间的区别。因为这两种方法都依赖于实现子片段。【参考方案2】:
根据我从您的问题中了解到的情况,您有一个ViewPager
,当单击按钮时会打开一个对话框,并且您想从您的ViewPager Fragment
访问一个方法?
如果这是您的问题,不妨尝试创建一个行为类似于Listener
的Interface
并将其传递给DialogFragment
。你的方法所在的Fragment
应该实现这个监听器。
【讨论】:
以上是关于从父片段调用方法的主要内容,如果未能解决你的问题,请参考以下文章