【问题标题】:Call Method from Fragment从片段调用方法
【发布时间】:2017-07-25 15:39:35
【问题描述】:

我正在使用一个数组来存储我的片段,如下所示:

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

稍后它们将被插入到滚动视图中。 碎片的数量没有改变,但 顺序可以改变。 我想要的是始终从数组中的第一个片段调用公共方法。

我尝试了类似的方法,但出现语法错误。

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

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

编辑:

我尝试为新的 Fragment 设置一个 Tag,然后调用接口方法。 这就是我尝试替换和设置标签的方式。

    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

我认为标签设置不正确?

【问题讨论】:

标签: android android-fragments


【解决方案1】:

您需要投射片段。例如:((FragmentA)fragmentManager.findFragmentById(R.id.fragmentA)).publicMethod();

如果所有片段都假设实现此方法。我建议使用该函数创建一个接口并在所有片段中实现。然后,使用接口进行转换,例如:

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

【讨论】:

  • 我得到这个异常:java.lang.NullPointerException: Attempt to invoke interface method 'void InterfaceA.pubMethodA()' on an null object reference
  • 我假设 fragmentManager.findFragmentById(R.id.fragmentA)) 返回 null。你可以看看stackoverflow.com/questions/8532462/…也许会有帮助
【解决方案2】:

你必须转换到一个已知的类。将您的语法更改为此。这要求您的Fragment 都是YourFragmentClass。否则,您必须使用 public 方法在您的每个 Fragment 中实现 Interface

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

您的接口的实现可能如下所示

public interface YourCommonInterface {
    public void commonMethod();
}

您的 Fragments 将实现该接口,您可以将其转换为该接口,例如

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

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

【讨论】:

  • @fbwnd 我的回答确实比你的回答晚了 20 秒。有时,当有人已经提交答案时,写答案需要时间。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多