我正在传递一个Uri.Builder对象,作为子类在 Android 中执行之前填充Uri所需的任何参数的机制。
问题是,基类使用builder.appendQueryParameter("q",searchPhrase);
添加的参数之一需要在子类中替换,但我只能找到appendQueryParameter()
,没有替换或设置方法。 appendQueryParameter()
具有相同的参数名称会添加该参数的另一个实例,但不会替换它。
我应该放弃并尝试另一种方式吗?或者有没有办法替换我还没有找到的查询参数?
答案 0 :(得分:14)
由于没有内置方法,我发现的最好方法是构建一个新的Uri。迭代旧Uri的所有查询参数,然后用新值替换所需的键。
private static Uri replaceUriParameter(Uri uri, String key, String newValue) {
final Set<String> params = uri.getQueryParameterNames();
final Uri.Builder newUri = uri.buildUpon().clearQuery();
for (String param : params) {
newUri.appendQueryParameter(param,
param.equals(key) ? newValue : uri.getQueryParameter(param));
}
return newUri.build();
}
答案 1 :(得分:4)
这将添加一个参数,或替换Kotlin中现有参数的值。
Uri的扩展:
fun Uri.addUriParameter(key: String, newValue: String): Uri {
val params = queryParameterNames
val newUri = buildUpon().clearQuery()
var isSameParamPresent = false
for (param in params) {
// if same param is present override it, otherwise add the old param back
newUri.appendQueryParameter(param,
if (param == key) newValue else getQueryParameter(param))
if (param == key) {
// make sure we do not add new param again if already overridden
isSameParamPresent = true
}
}
if (!isSameParamPresent) {
// never overrode same param so add new passed value now
newUri.appendQueryParameter(key,
newValue)
}
return newUri.build()
}
<强>实施强>
val appendedURL = originalUri.addUriParameter("UID","123456")
答案 2 :(得分:0)
我之前有同样的问题,并决定采取另一种方式。
创建一个包装类并将查询(比如setQueryParameter(key, value)
)存储在Map
(或ArrayMap
,类似的内容)。
然后,包装器实例的build()
方法处理原始Builder
的{{1}}和appendQueryParameter()
答案 3 :(得分:0)
@bmjohns所建议的方式更为简洁。
fun Uri.addUriParameter(key: String, newValue: String): Uri =
with(buildUpon()) {
clearQuery()
queryParameterNames.forEach {
if (it != key) appendQueryParameter(it, getQueryParameter(it))
}
appendQueryParameter(key, newValue)
build()
}