我正在寻找一种迭代Bundle对象中包含的条目的方法。目前,我错误地使用For Each方法:
for (String key : bundle.keySet()) {
if ("videourl".equals(key.toLowerCase()) || "priority".equals(key.toLowerCase())) {
// Save value to bundle using lowercase key value
extras.putString(key.toLowerCase(), (String) extras.get(key));
// Remove original version of this bundle entry
extras.remove(key);
}
}
上述方法的问题在于,它在未来的未确定时间会冒任意,非确定性行为的风险。
我已经看过Map对象的迭代器实现(例如https://stackoverflow.com/a/1884916/3957979):
for(Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, String> entry = it.next();
if(entry.getKey().equals("test")) {
it.remove();
}
}
但是,我无法直接访问Bundle的条目,因此我无法使用相同的方法。
如果Iterators可以与Bundle对象一起使用,请告诉我,或者请提出不同的方法。
答案 0 :(得分:0)
不幸的是,我无法找到使用迭代器添加和删除Bundle条目的方法。我的解决方法是将要添加的条目保存到临时Bundle对象中,并将要删除的条目的原始密钥名称保存到List。请参阅以下代码:
// Loop through all messages and change the extras' key names to lowercase (only for keys of interest)
Bundle tempBundle = new Bundle();
ArrayList<String> keysToBeRemoved = new ArrayList<>();
Bundle extras = messages.get(i).getExtras();
for (String key : extras.keySet()) {
// Check if key is not all lower case and if it is a key of interest
if (!key.equals(key.toLowerCase()) && isKeyOfInterest(key)) {
// Save value to bundle using lowercase key value
tempBundle.putString(key.toLowerCase(), extras.getString(key));
// Add original version of this key to a list for later deletion
keysToBeRemoved.add(key);
}
}
// Remove original entries from message extras
for (String originalKey : keysToBeRemoved) {
extras.remove(originalKey);
}
// Add all new bundle entries to message extras
extras.putAll(tempBundle);
尽管如此,如果有人弄清楚如何使用捆绑的Iterator,我很想知道!