如何遍历所有Bundle对象

我正在尝试创build一个通用的方式遍历所有Bundle对象的帮助器方法。

我的意思是“通用”

  1. 不需要知道Bundle中作为parameter passing的对象的名称(键)。
  2. 将来如果将另一个成员(键)添加到Bundle中,则不需要更改。

到目前为止,我想出了以下提纲:

private void bundleToSharedPreferences(Bundle bundle) { Set<String> keys = bundle.keySet(); for (String key : keys) { Object o = bundle.get(key); if (o.getClass().getName().contentEquals("int")) { // save ints } else if (o.getClass().getName().contentEquals("boolean")) { // save booleans } else if (o.getClass().getName().contentEquals("String")) { // save Strings } else { // etc. } } } 

这种方法是否有意义?

有没有更好的方法来完成这个?

Solutions Collecting From Web of "如何遍历所有Bundle对象"

如果我要这样做的话,我会通过反思去做。 存储一个静态的Map,使得String.class映射到SharedPreference.putString()等。然后,当你循环的项目时,检查他们的类地图。 如果它不存在,请检查超类等。这会给你正确的调用方法,或者让你知道请求的对象的types不是可以放入偏好的东西。

所以基本的algorithm是:

  1. 从包中获取对象
  2. 得到它的课程
  3. 看看class级是否在地图上
  4. 如果是,则调用指定的方法将其放入SharedPreferences中
  5. 如果不是,请获取它的超类并返回到第3步。
  6. 如果你一直到java.lang.Object,那么你有一个捆绑的对象,不能立即存储在SharedPreferences中。 取决于您打算沿着什么样的方式尝试处理,或者您可能只想logging错误并继续前进。 不知道你为什么这样做,不可能猜测当方法失败时你应该如何反应。 除非你完全控制了包和偏好,否则它总是会有的,但是如果你有这样的控制权,就没有必要跳过所有的这些环节,因为你可以更直接地定义你自己的键。

注意:reflection速度不是很快,编码和维护也不是最简单的。 如果可能的话,我build议找一个适合你的用例的不那么通用的方法。

你可以使用toString()方法将所有内容保存为String吗? 不知道原始types是否被映射到它们的Object等价物(例如int到Integer类),但是如果它们是,那么你也许可以做这样的事情,而不是费力地检查每个可能的类。

  for (String key : bundle.keySet()) { saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement } 

不知道这是否会满足您的需求,但我正在尝试做类似的事情,把一个bundle转换成一个JSONstring。