使用网络 URL for SUGGEST_COLUMN_ICON_1 搜索建议
Using a web URL for SUGGEST_COLUMN_ICON_1 for Search Suggestions
我有一个 SearchManager
设置,其中会在用户输入时显示建议下拉列表。结果来自我的服务器(http)。我想为每个选项显示一个图标(如果该文件确实存在)。
查看文档,我看到常量列的选项 SUGGEST_COLUMN_ICON_1
允许这些选项:
Column name for suggestions cursor. Optional. If your cursor includes this column, then all suggestions will be provided in a format that includes space for two small icons, one at the left and one at the right of each suggestion. The data in the column must be a resource ID of a drawable, or a URI in one of the following formats:
content (SCHEME_CONTENT)
android.resource (SCHEME_ANDROID_RESOURCE)
file (SCHEME_FILE)
我只有一个URL。哪个选项最适合我?
这里是 class
我正在做的地方:
public class MyCustomSuggestionProvider extends SearchRecentSuggestionsProvider {
public static final String AUTHORITY = "---.MyCustomSuggestionProvider";
public static final int MODE = DATABASE_MODE_QUERIES;
private final static String[] COLUMN_NAMES = {BaseColumns._ID,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
SearchManager.SUGGEST_COLUMN_QUERY,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,
SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA,
SearchManager.SUGGEST_COLUMN_ICON_1,
SearchManager.SUGGEST_COLUMN_INTENT_ACTION};
public MyCustomSuggestionProvider() {
setupSuggestions(AUTHORITY, MODE);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor recentCursor = super.query(uri, projection, selection,
selectionArgs, sortOrder);
String query = selectionArgs[0];
if (query == null || query.length() < 3) {
return recentCursor;
}
final MatrixCursor customCursor = new MatrixCursor(COLUMN_NAMES);
// Get web results from Retrofit Library
List<TheProfile> suggestions = RestClient.get().getCustomSearch(query, MyApp.getUserId());
for (TheProfile suggestion : suggestions) {
Uri searchIconUri = Uri.parse("http:/---/profile_images/" + String.valueOf(suggestion.id) + ".png");
try {
customCursor.addRow(new Object[]{
suggestion.id, suggestion.profile, suggestion.subcategory, suggestion.profile, suggestion.profile, suggestion.subcategory, searchIconUri, "android.intent.action.SEARCH"});
} catch (Exception e) {
e.printStackTrace();
}
}
return customCursor;
}
}
收集所有要用作图标的文件。它们可能在您的服务器上;您需要将它们嵌入到您的应用中。
如果它们不是.PNG 格式,请将它们转换为.PNG 格式。将它们缩放到您在应用程序中显示所需的大小。
将它们添加到您的 Android 项目的 /res/drawable-mdpi 文件夹中。将它们放在特定于 mdpi 的文件夹中将在不同的设备分辨率下以相同的大小缩放它们。
图标代码的第一部分是 SearchManager
的 return URI。使用格式为 "android.resource" 的方案:
android.resource://<package-name>/<resource-type>/<resource-name>
例如,您可以为每个图标创建一个 final URI
。这是我在项目中用于 /res/drawable-mdpi/ic_autocomplete_1.png
:
的 URI 示例
private final Uri searchIconUri = Uri.parse("android.resource://com.mycompany.android/drawable/ic_autocomplete_1");
当您遍历您的建议时,确定哪个图标是必需的,例如使用 switch
语句,并将该 URI 放入您的行对象中,就像您在代码中所做的那样.
对于像我一样仍在寻找此问题答案的人。它与我的代码非常相似,所以我决定分享它。我花了几个小时把这些放在一起。也许,我会为某人节省一些时间。
首先,您需要 Glide library。
将其添加到您应用的 build.gradle 文件中:
repositories {
mavenCentral() // jcenter() works as well because it pulls from Maven Central
}
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}
现在让我们对问题中的代码进行一些更改(在 MyCustomSuggestionProvider
class 中):
把它放在你的 for (TheProfile suggestion : suggestions) {
里面
FutureTarget<File> futureTarget = Glide
.with(getContext().getApplicationContext())
.load(searchIcon)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
File cacheFile = futureTarget.get();
Uri searchIconUri = Uri.fromFile(cacheFile);
注意这行代码:
.with(getContext().getApplicationContext())
这对于获取应用程序上下文非常重要,而不仅仅是上下文,因为我们不会在 ImageView 中显示 bmp。 Official Glide documentation 此类 Glide 用法。
毕竟你可以打电话:
// do things with bitmap and then release when finished:
Glide.clear(futureTarget);
我有一个 SearchManager
设置,其中会在用户输入时显示建议下拉列表。结果来自我的服务器(http)。我想为每个选项显示一个图标(如果该文件确实存在)。
查看文档,我看到常量列的选项 SUGGEST_COLUMN_ICON_1
允许这些选项:
Column name for suggestions cursor. Optional. If your cursor includes this column, then all suggestions will be provided in a format that includes space for two small icons, one at the left and one at the right of each suggestion. The data in the column must be a resource ID of a drawable, or a URI in one of the following formats:
content (SCHEME_CONTENT)
android.resource (SCHEME_ANDROID_RESOURCE)
file (SCHEME_FILE)
我只有一个URL。哪个选项最适合我?
这里是 class
我正在做的地方:
public class MyCustomSuggestionProvider extends SearchRecentSuggestionsProvider {
public static final String AUTHORITY = "---.MyCustomSuggestionProvider";
public static final int MODE = DATABASE_MODE_QUERIES;
private final static String[] COLUMN_NAMES = {BaseColumns._ID,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
SearchManager.SUGGEST_COLUMN_QUERY,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,
SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA,
SearchManager.SUGGEST_COLUMN_ICON_1,
SearchManager.SUGGEST_COLUMN_INTENT_ACTION};
public MyCustomSuggestionProvider() {
setupSuggestions(AUTHORITY, MODE);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor recentCursor = super.query(uri, projection, selection,
selectionArgs, sortOrder);
String query = selectionArgs[0];
if (query == null || query.length() < 3) {
return recentCursor;
}
final MatrixCursor customCursor = new MatrixCursor(COLUMN_NAMES);
// Get web results from Retrofit Library
List<TheProfile> suggestions = RestClient.get().getCustomSearch(query, MyApp.getUserId());
for (TheProfile suggestion : suggestions) {
Uri searchIconUri = Uri.parse("http:/---/profile_images/" + String.valueOf(suggestion.id) + ".png");
try {
customCursor.addRow(new Object[]{
suggestion.id, suggestion.profile, suggestion.subcategory, suggestion.profile, suggestion.profile, suggestion.subcategory, searchIconUri, "android.intent.action.SEARCH"});
} catch (Exception e) {
e.printStackTrace();
}
}
return customCursor;
}
}
收集所有要用作图标的文件。它们可能在您的服务器上;您需要将它们嵌入到您的应用中。
如果它们不是.PNG 格式,请将它们转换为.PNG 格式。将它们缩放到您在应用程序中显示所需的大小。
将它们添加到您的 Android 项目的 /res/drawable-mdpi 文件夹中。将它们放在特定于 mdpi 的文件夹中将在不同的设备分辨率下以相同的大小缩放它们。
图标代码的第一部分是
SearchManager
的 return URI。使用格式为 "android.resource" 的方案:android.resource://<package-name>/<resource-type>/<resource-name>
例如,您可以为每个图标创建一个
的 URI 示例final URI
。这是我在项目中用于/res/drawable-mdpi/ic_autocomplete_1.png
:private final Uri searchIconUri = Uri.parse("android.resource://com.mycompany.android/drawable/ic_autocomplete_1");
当您遍历您的建议时,确定哪个图标是必需的,例如使用
switch
语句,并将该 URI 放入您的行对象中,就像您在代码中所做的那样.
对于像我一样仍在寻找此问题答案的人。它与我的代码非常相似,所以我决定分享它。我花了几个小时把这些放在一起。也许,我会为某人节省一些时间。 首先,您需要 Glide library。
将其添加到您应用的 build.gradle 文件中:
repositories {
mavenCentral() // jcenter() works as well because it pulls from Maven Central
}
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}
现在让我们对问题中的代码进行一些更改(在 MyCustomSuggestionProvider
class 中):
把它放在你的 for (TheProfile suggestion : suggestions) {
FutureTarget<File> futureTarget = Glide
.with(getContext().getApplicationContext())
.load(searchIcon)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
File cacheFile = futureTarget.get();
Uri searchIconUri = Uri.fromFile(cacheFile);
注意这行代码:
.with(getContext().getApplicationContext())
这对于获取应用程序上下文非常重要,而不仅仅是上下文,因为我们不会在 ImageView 中显示 bmp。 Official Glide documentation 此类 Glide 用法。
毕竟你可以打电话:
// do things with bitmap and then release when finished:
Glide.clear(futureTarget);