我曾经使用public static
成员变量,以便起始Activity
能够读取前一个Activity
的值。我知道这不是一个好的做法,它涉及风险和限制,例如拥有当前Activity
的多个实例并从静态变量中获取错误的值。
现在我使用 Parcelable
并在 Bundle 中传递参数,但有时这是一种负担。例如,在我当前的项目中,我有一个ExpandableListView
,组/子存储在Map<group name, List<child>>
中。此列表位于FragmentActivity
TabHost
内的Fragment
中。单击列表中的子项将启动另一个具有相同结构的FragmentActivity
(TabHost
和内部Fragment
(。从这个Fragment
您可以编辑子项。当我需要通知列表孩子已更改时,问题就来了。遵循最佳实践,我决定使用Broadcast
将修改后的子级发送到第一个Activity
,并让它更新列表。
Parcelable
,我会使用一个public static
变量,我只需要在列表中调用notifyDataSetChange()
来刷新,因为Map
中的实际对象实例被修改了。使用Parcelable
,即使对象相同,修改时也是不同内存区域中的不同变量。当第一个Activity
收到Broadcast
时,它需要遍历所有组中的所有子对象,以检查它是否是同一个对象,并将自己替换为广播Parcelable
。
我做错了什么?还是应该是这样的?对于这种问题,我真的很想走公共静态的方式:-P
PS:像这样。长箭头是广播,短箭头是活动,告诉片段替换地图中的子项并刷新列表。
Fragment Activity <----
| |
TabHost | |
| |
Fragment <--| |
|
Fragment Activity |
|
TabHost |
|
Fragment --------------
从您的第一个活动中,您可以startActivityForResult
.然后,第二个活动可以返回更新的数据集。然后,您的第一个活动可以将数据映射重新分配给选取的任何onActivityResult
,您可以使用notifyDataSetChanged
。