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

hik*_*koo 13 java android android-fragments android-activity fragmentmanager

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

我的片段方法:

public void setItemFromDrawer(String sourceTag, String destTag) {
    //dosomething
}
Run Code Online (Sandbox Code Playgroud)

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

Far*_*ihi 31

首先创建一个接口

public interface MyInterface
{
    void myAction() ;
}
Run Code Online (Sandbox Code Playgroud)

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

public MyFragment extends Fragment implements MyInterface
Run Code Online (Sandbox Code Playgroud)

在您的活动中,定义MyInterface类型的字段:

  private MyInterface listener ;

  public void setListener(MyInterface listener)
  {
     this.listener = listener ;
  }
Run Code Online (Sandbox Code Playgroud)

创建片段并添加片段时:

setListener(myFragment);
Run Code Online (Sandbox Code Playgroud)

最后,当你想要调用Fragment方法的condtion时,只需调用:

listener.myAction() ; // this will call the implementation in your MyFragment class.
Run Code Online (Sandbox Code Playgroud)


use*_*222 7

它意味着你调用一个片段方法

((YourFragmentClass) fragment).Yourmethod();
Run Code Online (Sandbox Code Playgroud)


小智 6

为了更好地解释user5466222的答案:

YourFragmentClass fragment = new YourFragmentClass();
((YourFragmentClass) fragment).yourmethod();
Run Code Online (Sandbox Code Playgroud)


Khi*_*yat 2

在 Activity 中,在加载片段时使用类似以下内容:

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
Run Code Online (Sandbox Code Playgroud)

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

currentFragment.setItemFromDrawer("sourceTag","destTag");
Run Code Online (Sandbox Code Playgroud)