从父Activity调用Fragment方法

时间:2012-06-05 18:47:52

标签: android android-fragments

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

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

有谁可以举例说明如何做到这一点?我想从父Activity调用片段中的特定方法。感谢。

12 个答案:

答案 0 :(得分:192)

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

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

<强>更新 对于那些使用Kotlin的人

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()

答案 1 :(得分:74)

如果您使用的是“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。 OR

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(); 

OR

2)

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

答案 2 :(得分:9)

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

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();

答案 3 :(得分:4)

  1. 如果您没有使用支持库片段,请执行以下操作:
  2. ((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


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

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

答案 4 :(得分:3)

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

csvDF.groupBy("name").count().writeStream.outputMode("complete").format("console").start().awaitTermination()

答案 5 :(得分:1)

从片段到活动:

((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();

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

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

答案 6 :(得分:1)

FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 

答案 7 :(得分:0)

首先,您在ID Status Title Class 1 None MR. 1 2 1 MRS. 2 3 0 MR. 3 4 None MRS. 1 5 None MR. 1 6 1 MRS. 3 7 0 MR. 3 8 None MRS. 1 9 None MR. 1 10 1 MRS. 2 11 0 MR. 3 12 None MRS. 1 中创建方法,如

fragment

在您的public void name() { } 中添加

添加activity方法

onCreate()

最后调用您要调用的方法并添加

myfragment fragment=new myfragment()

尝试此代码

答案 8 :(得分:0)

您还使用

之类的界面调用片段方法

首先创建界面

interface name{

void methodname();

}

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

myfragment extends Fragment implement 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 fragment();

click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               fragment.methodname();
            }
        });

}

}

答案 9 :(得分:0)

我不知道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中进行同样的操作。

答案 10 :(得分:0)

((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();

答案 11 :(得分: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();
}