从父Activity调用Fragment方法

gcl*_*cl1 113 android android-fragments

我在Android Fragments Dev Guide中看到,"活动可以通过使用findFragmentById()或从FragmentManager获取对片段的引用来调用片段中的方法findFragmentByTag()".

下面的示例显示了如何获取片段引用,但不显示如何调用片段中的特定方法.

任何人都可以举例说明如何做到这一点?我想从父Activity调用片段中的特定方法.谢谢.

Dhe*_*ngh 198

没有完全得到问题,因为它太简单了:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>(); 
Run Code Online (Sandbox Code Playgroud)

更新: 对于那些使用Kotlin的人

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()
Run Code Online (Sandbox Code Playgroud)

  • 我怎样才能获得片段ID? (30认同)
  • 好的,这很简单,谢谢(我是碎片的新手).现在困难的部分是我似乎无法首先获得对片段的引用.它没有在XML布局中定义,所以我不能使用findFragmentById().我不清楚我正在遵循的代码(参见上文)甚至创建片段的方式/位置.如果是,我可以添加一个标签并使用findFragmentByTag().示例的AccountListActivity部分确实调用了beginTransaction().add(),但是根据我的跟踪,它从未被调用过.这是我在摸不着头脑的地方.我很感激任何建议. (10认同)
  • 通过这样做,我最终在一个空对象引用! (4认同)
  • @Fattie,如果我没有片段标签怎么办? (3认同)
  • 我没有在xml中声明片段...所以我没有片段ID,我该怎么办? (2认同)

Gen*_*ene 75

如果你使用"import android.app.Fragment;"然后使用:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 
Run Code Online (Sandbox Code Playgroud)

其中R.id.example_fragment最有可能是xml布局中的FrameLayout id.要么

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
Run Code Online (Sandbox Code Playgroud)

其中FragTagName是你指定的名字:

TabHost mTabHost.newTabSpec(“FragTagName”)
Run Code Online (Sandbox Code Playgroud)

如果您使用"import android.support.v4.app.Fragment;"然后使用以下任一方法:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 
Run Code Online (Sandbox Code Playgroud)

要么

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
Run Code Online (Sandbox Code Playgroud)

  • 我有一个 ID 为 R.id.example_fragment 的 CoordinatorLayout,它返回 null。我正在使用 import android.support.v4.app.Fragment; 该怎么办? (2认同)

JDJ*_*JDJ 9

如果您使用的是支持库,则需要执行以下操作:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
Run Code Online (Sandbox Code Playgroud)


小智 7

对于这个问题来说已经太晚了,但这是获取片段实例并调用片段中的方法的简单方法;您必须获取片段的实例,然后调用您的公共方法:

在你的片段中:

 private static yourFragment instance;
Run Code Online (Sandbox Code Playgroud)

然后在onCreateView你的片段中:

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
   Bundle savedInstanceState) {

        instance= this;

        View v = inflater.inflate(R.layout.fragment_tools, container, false);
        binding = FragmentToolsBinding.inflate(inflater, container, false);

        return v;
    }
Run Code Online (Sandbox Code Playgroud)

而且在您的片段中,您必须有一个返回实例的静态方法:

public static yourFragment GetInstance()
{
    return instance;
}
Run Code Online (Sandbox Code Playgroud)

然后你的片段中有一个公共方法,你想像这样调用它:

public  void  theMethod()
{
    Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以获取片段实例并调用你的非静态公共方法,如下所示:

   yourFragment frag = yourFragment.GetInstance();
   frag.theMethod();
    
Run Code Online (Sandbox Code Playgroud)


Chi*_*hah 5

  1. 如果您没有使用支持库 Fragment,请执行以下操作:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2. 如果您使用的是支持库 Fragment,请执行以下操作:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


小智 5

从片段到活动:

((YourActivityClassName)getActivity()).yourPublicMethod();
Run Code Online (Sandbox Code Playgroud)

从活动到片段:

FragmentManager fm = getSupportFragmentManager();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();
Run Code Online (Sandbox Code Playgroud)

如果您通过代码添加片段并在添加片段时使用了标签字符串,请改用findFragmentByTag

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
Run Code Online (Sandbox Code Playgroud)