133

我在Android Fragments Dev GuidefindFragmentById()中看到“活动可以通过从 FragmentManager 获取对 Fragment 的引用,使用or来调用片段中的方法findFragmentByTag()。”

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

谁能举例说明如何做到这一点?我想从父 Activity 调用 Fragment 中的特定方法。谢谢。

4

13 回答 13

223

没有得到这个问题,因为它太简单了:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>(); 
于 2012-06-05T18:51:48.673 回答
80

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

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

其中 R.id.example_fragment 很可能是 xml 布局中的 FrameLayout id。或者

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

其中 FragTagName 是您指定的名称:

TabHost mTabHost.newTabSpec(“FragTagName”)

如果您使用“import android.support.v4.app.Fragment;” 然后使用:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

或者

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
于 2014-08-20T23:51:16.877 回答
9

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

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
于 2014-06-11T23:26:54.590 回答
5
  1. 如果您没有使用支持库 Fragment,请执行以下操作:

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


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

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

于 2015-12-14T07:22:51.693 回答
4

从片段到活动:

((YourActivityClassName)getActivity()).yourPublicMethod();

从活动到片段:

FragmentManager fm = getSupportFragmentManager();

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

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

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
于 2018-09-08T06:26:47.190 回答
3

我认为最好是在调用片段中的方法之前检查是否添加了片段。做这样的事情来避免空异常。

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
  fragment.<specific_function_name>(); 
}
于 2017-03-06T00:32:08.883 回答
3

您还可以使用类似的接口调用片段方法

首先你创建界面

public interface InterfaceName {
    void methodName();
}

创建接口后,您在片段中实现接口

MyFragment extends Fragment implements InterfaceName {
    @overide
    void methodName() {

    }
}

并且您在活动中创建接口的引用

class Activityname extends AppCompatActivity {
    Button click;
    MyFragment fragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        click = findViewById(R.id.button);

        fragment = new MyFragment();

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               fragment.methodName();
            }
        });
    }
}
于 2018-09-16T13:13:33.947 回答
3

这个问题太迟了,但这是获取片段实例和调用片段中的方法的简单方法;您必须获取片段的实例,然后调用您的公共方法:

在您的片段中:

 private static yourFragment instance;

然后在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;
    }

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

public static yourFragment GetInstance()
{
    return instance;
}

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

public  void  theMethod()
{
    Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
}

然后您可以获取片段实例并像这样调用您的非静态公共方法:

   yourFragment frag = yourFragment.GetInstance();
   frag.theMethod();
    
于 2021-09-30T20:34:53.383 回答
1

首先你创建你fragment喜欢的方法

public void name()
{


}

在你的activity你添加这个

添加onCreate()方法

myfragment fragment=new myfragment()

最后调用你想调用的方法添加这个

fragment.method_name();

试试这个代码

于 2018-09-16T11:10:37.317 回答
1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 
于 2018-09-20T11:07:32.173 回答
1

我不知道Java,但在C#(Xamarin.Android) 中,每次需要调用该方法时都无需查找片段,见下文:

public class BrandActivity : Activity
{
    MyFragment myFragment;

    protected override void OnCreate(Bundle bundle)
    {       
        // ...
        myFragment = new MyFragment();      
        // ...
    }

    void someMethod()
    {
        myFragment.MyPublicMethod();
    }
}

public class MyFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle bundle)
    {
        // ...
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
        // ...
    }

    public void MyPublicMethod()
    {
        // ...
    }   
}

我认为Java你也可以这样做。

于 2019-03-05T14:07:46.683 回答
0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
于 2020-06-11T07:51:24.717 回答
0

这个问题为时已晚,但无论如何都会为任何仍然需要它的人发布我的答案。我找到了一种更简单的方法来实现这一点,而无需使用片段 ID 或片段标签,因为这正是我所寻求的。

首先,我在 ParentActivity 类中声明了我的 Fragment:

MyFragment myFragment;

像往常一样初始化我的 viewPager,使用我已经在上面的类中添加的片段。然后,在 myFragment 中创建了一个名为scrollToTop的公共方法,该方法执行我想要从 ParentActivity 执行的操作,假设将我的 recyclerview 滚动到顶部。

public void scrollToTop(){
    mMainRecyclerView.smoothScrollToPosition(0);
}

现在,在 ParentActivity 我调用了如下方法:

try{
   myFragment.scrollToTop();
}catch (Exception e){
   e.printStackTrace();
}
于 2020-09-18T22:03:23.657 回答