我在Android Fragments Dev Guide中看到“活动可以通过使用findFragmentById()
或findFragmentByTag()
从FragmentManager获取对片段的引用来调用片段中的方法。”
下面的示例显示了如何获取片段引用,但不显示如何调用片段中的特定方法。
有谁可以举例说明如何做到这一点?我想从父Activity调用片段中的特定方法。感谢。
答案 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)
((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();
}