在Android中的Uri.Builder中替换查询参数?

时间:2015-03-06 11:22:54

标签: android uri uribuilder

我正在传递一个Uri.Builder对象,作为子类在 Android 中执行之前填充Uri所需的任何参数的机制。

问题是,基类使用builder.appendQueryParameter("q",searchPhrase);添加的参数之一需要在子类中替换,但我只能找到appendQueryParameter(),没有替换或设置方法。 appendQueryParameter()具有相同的参数名称会添加该参数的另一个实例,但不会替换它。

我应该放弃并尝试另一种方式吗?或者有没有办法替换我还没有找到的查询参数?

4 个答案:

答案 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()
  }