1

我有一个 SlidingDrawer 在我的所有活动中都被引用。抽屉非常详细,并且具有很深的视图层次结构。目前,我的所有活动都在创建时调用应用程序上下文以接收抽屉的单例副本。当调用活动 onPause 时,它​​会从其顶级 ViewGroup 中删除抽屉。这行得通,但我不知道这是否是最好的方法。

我遇到的另一个问题是上下文使用。SlidingDrawer 有一些按钮可以触发一些对话框。知道我不能传递应用程序上下文,我只是创建了一个OnActivityChangeBroadcasterListener更改了抽屉的引用上下文。但即使这样,对话框也总是出现在启动器活动中。

有没有人对此事有任何想法或智慧?

4

2 回答 2

4

这行得通,但我不知道这是否是最好的方法。

您正在泄漏内存。永远不要在活动之间传递小部件。永远不要将小部件或任何其他引用活动的东西放在Application对象或静态数据成员中,除非您打算null在活动被销毁时删除该引用。

有没有人对此事有任何想法或智慧?

请在每个活动中重新创建您的抽屉。

于 2011-05-05T16:44:15.797 回答
1

我的方法是将 UI 与数据分离。如果您的许多活动使用相同的 SlidingDrawer,我会将 SlidingDrawer 显示的数据分离到其自己的 [非 UI] 类中,以便它仅存在于一个位置,并让每个 SlidingDrawer 实例从该数据中填充自己。您可以在 XML 中定义一次 SlidingDrawer,<include>然后在您需要的所有布局中定义它。

然后,我将有一个函数使用来自您的单独类的数据填充 SlidingDrawer(可通过单例对象或通过制作数据来访问static)。要实现这一点,您可以创建一个static将 SlidingDrawer 作为参数填充的方法 ( public static void loadSlidingDrawer(SlidingDrawer destinationView) {...}),或者您可以扩展 SlidingDrawer 并使每个实例都可以访问该类方法。

CommonsWare 是正确的,您将在当前策略下到处泄漏内存。UI 元素需要具有不断销毁和重新创建的灵活性,因此将所有数据分离到 UI 只需访问以显示的非 UI 类中是一个非常好的习惯。这很好地解耦了一切,并允许框架有效地运行。

于 2011-05-05T16:53:50.987 回答