我正在使用数组来存储我的片段:
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
我认为标签设置不正确?
答案 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)
使用事件和处理程序。在片段中注册要调用其公共方法的事件处理程序。