从父活动调用片段方法

我在 Android 碎片开发指南中看到,“活动可以使用 findFragmentById()findFragmentByTag(),通过从 FragmentManager 获取对片段的引用来调用片段中的方法。”

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

有人能举个例子吗?我想从父 Activity 调用片段中的一个特定方法。谢谢。

207580 次浏览

不明白这个问题实在是太简单了:

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

如果你正在使用一个支持库,你会想要做这样的事情:

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

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

1)

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

其中 R.id.example_ 片段最有可能是 xml 布局中的 FrameLayout id。 或者

2)

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

其中 FragTagName 是 u 指定的名称,当您这样做的时候:

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();
  1. 如果不使用支持库片段,请执行以下操作:

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


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

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

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

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
fragment.<specific_function_name>();
}

从碎片到活动:

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

如果您通过代码添加了片段,并且在添加片段时使用了 标签字符串,那么改为使用 寻找片段标签:

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

首先在 fragment中创建方法,如

public void name()
{




}

在你的 activity里加上这个

加入 onCreate()

myfragment fragment=new myfragment()

最后调用要调用 add this 的方法

fragment.method_name();

试试这个代码

您还可以使用类似于

首先创建界面

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();
}
});
}
}
FragmentManager fm = getFragmentManager();
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment);
frag.<specific_function_name>();

我不知道关于 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中你也可以做同样的事情。

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

对于这个问题已经太迟了,但无论如何我会发布我的答案,任何人仍然需要它。 我找到了一种更简单的方法来实现这一点,而不使用片段 id 或片段标记,因为这正是我要寻找的。

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

MyFragment myFragment;

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

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

现在,在 ParentActivity 中,我把这个方法调用如下:

try{
myFragment.scrollToTop();
}catch (Exception e){
e.printStackTrace();
}

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

在你的片段里:

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

这对我很有效,希望有人能从中得到帮助

OnDemandFrag frag = new OnDemandFrag();

用这个代替 main 中的片段

FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.content_frame, frag).commit();

我只是在 MainActivity 中创建了一个片段的全局实例,然后从这个实例运行片段的函数

frag.hidelayer();