从片段调用方法

时间:2017-07-24 12:37:20

标签: android android-fragments

我正在使用数组来存储我的片段:

fragmentList = new Fragment[]{
            new FragmentA(),
            new FragmentB(),
            new FragmentC(),
            ...        
};

稍后它们将被插入到scrollview中。 碎片的数量不会改变,但是 序列可以改变。 我想要的是始终从数组中的第一个片段调用公共方法。

我尝试过类似的东西,但是语法错误。

 ((fragmentList[0])fragmentManager.findFragmentById(R.id.fragmentA)).publicMethod();

如何从第一个片段调用公共方法?

编辑:

我尝试将Tag设置为新的Fragment,然后调用interface方法。 这就是我尝试替换和设置标记的方式。

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    for (int arrayIndex=0, fragmentNumber=1; fragmentNumber <= numberOfFragments; arrayIndex++, fragmentNumber++){
        fragmentTransaction.replace(r.getIdentifier("fragment" + fragmentNumber, "id", packageName), fragmentList[arrayIndex]);
        fragmentTransaction.add(fragmentList[arrayIndex],"fragment"+fragmentNumber);
    }
    ((Unfold)fragmentManager.findFragmentByTag("fragment1")).unfold();
    fragmentTransaction.commit();

但是在((Unfold)fragmentManager.findFragmentByTag("fragment1")).unfold();

我收到错误:Attempt to invoke interface method 'void MyApp.Unfold.unfold()' on a null object reference

我认为标签设置不正确?

3 个答案:

答案 0 :(得分:1)

你需要施放片段。例如:((FragmentA)fragmentManager.findFragmentById(R.id.fragmentA)).publicMethod();

如果所有片段都假设实现此方法。我建议创建一个具有该功能的接口,并在所有片段中实现。然后,使用界面进行投射,例如:

public interface MyInterface{...}
((MyInterface)fragmentManager.findFragmentById(R.id.fragmentA)).publicMethod();

答案 1 :(得分:0)

你必须施放到一个已知的类。将语法更改为此。这要求您的Fragment全部为YourFragmentClass。否则,您必须使用公共方法在您的每个片段中实现Interface

((YourFragmentClass)fragmentManager.findFragmentById(R.id.fragmentA)).publicMethod();

您的界面的实现可能如下所示

public interface YourCommonInterface {
    public void commonMethod();
}

您的片段会实现该接口,您可以将其转换为例如。

((YourCommonInterface)fragmentManager.findFragmentById(R.id.fragmentA)).publicMethod();

这样做的好处是可以有不同类型的碎片。

答案 2 :(得分:0)

使用事件和处理程序。在片段中注册要调用其公共方法的事件处理程序。