从父片段调用方法

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 访问一个方法?

如果这是您的问题,不妨尝试创建一个行为类似于ListenerInterface 并将其传递给DialogFragment。你的方法所在的Fragment 应该实现这个监听器。

【讨论】:

以上是关于从父片段调用方法的主要内容,如果未能解决你的问题,请参考以下文章

Python从父调用扩展子方法

从父类ctor调用重写的方法

从父类方法调用子类方法

从父类对象调用子类方法

在 JavaScript 中从父级调用子方法

从父类调用子组件方法 - Angular