如何在xml中使用gradle占位符applicationId来制作唯一的contentProvider权限
How to use gradle placeholder applicationId in xml to make unique contentProvider authority
我有以下可搜索的 xml 声明:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:label="@string/app_name"
android:voiceSearchMode="showVoiceSearchButton"
android:includeInGlobalSearch="true"
android:searchMode="queryRewriteFromText"
android:searchSuggestAuthority="com.mypackage.MyRecentSuggestionsProvider"
android:searchSuggestSelection=" ?"
android:hint="@string/search_hint">
</searchable>
现在这里是 contentProvider 本身:
package com.mypackage.contentProviders
import android.content.SearchRecentSuggestionsProvider
import com.mypackage.BuildConfig
class MySuggestionsProvider : SearchRecentSuggestionsProvider() {
val AUTHORITY = BuildConfig.APPLICATION_ID + ".MySuggestionsProvider"
val MODE = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
init{
setupSuggestions(AUTHORITY, MODE)
}
}
现在的问题是我在 gradle 中有 3 种风格,所以 contentProvider class 中定义权限的行使用应用程序 ID 使其唯一,以便所有 3 种风格都可以存在同时在设备上。我记得,两个应用程序不能有重复的权限。
现在我的 problem:i 不想覆盖 searchable.xml 每种风格,只是为了为每种风格声明另一个权限。我宁愿做这样的事情:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:label="@string/app_name"
android:voiceSearchMode="showVoiceSearchButton"
android:includeInGlobalSearch="true"
android:searchMode="queryRewriteFromText"
android:searchSuggestAuthority="{applicationId}.MyRecentSuggestionsProvider"
android:searchSuggestSelection=" ?"
android:hint="@string/search_hint">
</searchable>
我们经常将 android 清单用作占位符。无论如何,我不必为内容提供者创建不同的 xml 声明,而是以某种方式使其每种口味独一无二?
清单占位符在资源中不起作用。但是,您可以:
在Gradle中使用resValue
根据风味为字符串资源定义不同的值,然后让android:searchSuggestAuthority
引用该字符串资源
为每种口味设置源集,在每一个中定义一个字符串资源,然后让 android:searchSuggestAuthority
引用该字符串资源
每个口味都有源集,每个都有不同的 searchable.xml
副本,这是您要避免的
我有以下可搜索的 xml 声明:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:label="@string/app_name"
android:voiceSearchMode="showVoiceSearchButton"
android:includeInGlobalSearch="true"
android:searchMode="queryRewriteFromText"
android:searchSuggestAuthority="com.mypackage.MyRecentSuggestionsProvider"
android:searchSuggestSelection=" ?"
android:hint="@string/search_hint">
</searchable>
现在这里是 contentProvider 本身:
package com.mypackage.contentProviders
import android.content.SearchRecentSuggestionsProvider
import com.mypackage.BuildConfig
class MySuggestionsProvider : SearchRecentSuggestionsProvider() {
val AUTHORITY = BuildConfig.APPLICATION_ID + ".MySuggestionsProvider"
val MODE = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
init{
setupSuggestions(AUTHORITY, MODE)
}
}
现在的问题是我在 gradle 中有 3 种风格,所以 contentProvider class 中定义权限的行使用应用程序 ID 使其唯一,以便所有 3 种风格都可以存在同时在设备上。我记得,两个应用程序不能有重复的权限。
现在我的 problem:i 不想覆盖 searchable.xml 每种风格,只是为了为每种风格声明另一个权限。我宁愿做这样的事情:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:label="@string/app_name"
android:voiceSearchMode="showVoiceSearchButton"
android:includeInGlobalSearch="true"
android:searchMode="queryRewriteFromText"
android:searchSuggestAuthority="{applicationId}.MyRecentSuggestionsProvider"
android:searchSuggestSelection=" ?"
android:hint="@string/search_hint">
</searchable>
我们经常将 android 清单用作占位符。无论如何,我不必为内容提供者创建不同的 xml 声明,而是以某种方式使其每种口味独一无二?
清单占位符在资源中不起作用。但是,您可以:
在Gradle中使用
resValue
根据风味为字符串资源定义不同的值,然后让android:searchSuggestAuthority
引用该字符串资源为每种口味设置源集,在每一个中定义一个字符串资源,然后让
android:searchSuggestAuthority
引用该字符串资源每个口味都有源集,每个都有不同的
searchable.xml
副本,这是您要避免的