Android - 片段之间的通信

时间:2016-02-10 02:21:35

标签: android performance android-fragments android-viewpager

我正在尝试从另一个片段(f2)访问一个片段(f1)中的函数。似乎我必须在f1 public和static中使我的函数能够从f2访问它。

我已经读过从另一个片段访问一个片段不是一个好主意,所以我试图让f2访问我的Activity,然后连接到f1中的函数。虽然,即使这样做,我仍然必须使我的功能在f1公开和静态。

我没有重复使用Fragments,我只是在ViewPager中将它们放在碎片中来回扫描。

目前我有很多静态变量因为我必须使我的函数静态才能从其他片段访问它们。

我是以错误的方式来做这件事的吗?有没有更好的办法?

提前致谢。

3 个答案:

答案 0 :(得分:2)

除非你对自己所做的事情非常掌控,否则你会走上一条痛苦的道路。

首先,通过静态方法和变量共享状态是一种非常糟糕的做事方式,静态成员无法访问片段实例中的任何内容。如果您真的认为需要使用静态方法,请不要将它们放入片段类中。他们没有在那里提供优势。把它们放在一个他们都参考的普通类中。

其次,如果您使用带有片段的ViewPager,则无法保证任何给定片段的视图层次结构在任何时刻都存在。这是因为ViewPager通常只保留当前页面上或与可见页面偏移+/- 1的片段视图。因此,如果您需要告知当前片段偏移+2处的片段,您将无法对其进行可见的更改。

相反,最简单的方法是创建一个对象,该对象维护您希望在片段之间共享的状态,并让它们都对该对象进行更改。如果您需要对其他片段进行即时更改,则可以使用类似事件总线的内容将这些更改传递给其他活动片段。

您尝试做的事情通常相当复杂。期望花费大量时间设计正确的解决方案,并确保了解片段和ViewPager的工作原理。

答案 1 :(得分:2)

你有两个问题

1。我这是错误的方式吗?

是的,不推荐使用方法&变量声明为static,只是为了让它们用于从类外部访问。

2。有更好的方法吗?

是的,在其片段内将方法声明为公共(但不是静态)。 从活动(托管片段)获取对片段的引用,使用FragmentManager类方法findFragmentById()或findFragmentByTag()然后调用方法。

示例:

CustomMarker.prototype.remove = function ()
{
    if (this.div)
    {
        this.div.parentNode.removeChild(this.div);
        this.div = null;
    }
};

答案 2 :(得分:0)

如果您确实需要隔离两个功能,则可以使用广播。只需从一个片段发送一个广播,然后将广播接收器放在另一个片段中。