如何从主活动调用片段方法

17

我在片段类中有一个方法。我想从主活动中调用该方法,但我不想使用FragmentById(或)FragmentByTag。

我的片段方法:

public void setItemFromDrawer(String sourceTag, String destTag) {
    //dosomething
}

如何在不使用FragmentById(或)FragmentByTag的情况下从主活动调用上面的方法?


2
当您使用FragmentTransaction加载片段时,请保存片段对象,稍后您可以从该对象调用任何公共方法。 - Khizar Hayat
我不明白,请给一个示例代码。 - hikoo
可能是重复的问题,与https://dev59.com/fmgv5IYBdhLWcg3wBMSg?rq=1相同。 - Jamil
尝试这个 https://dev59.com/fmgv5IYBdhLWcg3wBMSg#73796270 - Zahid Iqbal
5个回答

40

首先创建一个接口。

public interface MyInterface
{
    void myAction() ;
}

您的片段必须实现此接口。

public MyFragment extends Fragment implements MyInterface
在你的活动中,定义一个类型为MyInterface的字段
  private MyInterface listener ;

  public void setListener(MyInterface listener)
  {
     this.listener = listener ;
  }

当创建你的片段并添加它时:

setListener(myFragment);

最后,当您想调用Fragment方法时,只需调用:

listener.myAction() ; // this will call the implementation in your MyFragment class.

我总是觉得接口是最有效和最好的选择。这是我会推荐的答案。 - Carlos Anyona
简单而最佳的答案! - Android learner
你在哪里设置 setListener(myFragment); 的监听器????? - ekashking
在创建您的片段并将其添加到活动中时,请注意!@ekashking - Farhad
如果我将它添加到ViewPager中会怎样? - ekashking

9
这意味着您在调用片段方法。
((YourFragmentClass) fragment).Yourmethod();

8
为了更好地解释user5466222的答案:
YourFragmentClass fragment = new YourFragmentClass();
((YourFragmentClass) fragment).yourmethod();

如果只是那么简单就好了……但事实并非如此。"尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'" - ekashking

2

在 Activity 中,加载 fragment 的代码应该像这样:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(container, fragment);

transaction.addToBackStack(null); // if you want to store transaction        
transaction.commit();
currentFragment = fragment; // currentFragment is global Fragment variable

在需要调用片段方法的地方使用以下行

currentFragment.setItemFromDrawer("sourceTag","destTag");

当前代码行“currentFragment = fragment;”中的“fragment”是什么? - hikoo
你正在加载的片段中实现了你的函数。 - Khizar Hayat

-2

((YourFragment类) fragment).你的方法();

对我有用


6
碎片意味着什么? - hikoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接