如何遍历所有Bundle对象

ate*_*iob 32 android bundle sharedpreferences

我试图创建一个辅助方法,以一般方式迭代所有Bundle对象.

"通用"我的意思是:

  1. 不需要知道作为参数传递的Bundle中对象的名称(键).
  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.
        }
    } 
  }
Run Code Online (Sandbox Code Playgroud)

这种方法有意义吗?

有没有更好的方法来实现这一目标?

Dan*_*iel 70

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

 for (String key : bundle.keySet()) {
        saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement
 }
Run Code Online (Sandbox Code Playgroud)

不确定这是否适合您的需求,但我正在尝试做类似的事情,现在将一个包转换为JSON字符串.


Gin*_*ray 3

如果我真的要这么做的话,我会通过反思来做到这一点。存储一个静态映射,以便 String.class 映射到 SharedPreference.putString() 等。然后,当您循环遍历项目时,根据映射检查它们的类。如果它不存在,请检查超类等。这将为您提供正确的调用方法,或者让您知道所请求的对象的类型不能放入首选项中。

所以基本算法是:

  1. 从包中获取对象
  2. 获取它的类
  3. 查看该类是否在地图中
  4. 如果是,则调用指定的方法将其放入 SharedPreferences 中
  5. 如果不是,则获取它的超类并返回到步骤 3。
  6. 如果一直到达 java.lang.Object,那么您将获得一个无法立即存储在 SharedPreferences 中的捆绑对象。根据您一路上遇到的类,您可能也想尝试处理这个问题,或者您可能只想记录错误并继续。如果不知道为什么要这样做,就不可能猜测当该方法失败时您应该如何反应。除非您完全控制捆绑包和首选项,否则它总是会发生,但如果您拥有足够的控制权,则无需跳过所有这些障碍,因为您可以更直接并简单地定义自己的键。

注意:反射速度并不快,而且也不是最容易编码和维护的事情。如果可能的话,我建议找到一种适合您的用例的不太通用的方法。