好的我有一个多选ListView工作正常.我检查联系人的框(保存在String []中)并可以返回值.因为有些人有一堆联系我想创建一个搜索栏,有点像Android手机书的库存.我创建了一个EditText并将其对齐在我的列表上方.我在StackOverflow上找到了过滤代码,它运行得非常好.
我的问题:
当您过滤某些人的名字,并选择名称时,当您从EditText退格或继续键入时,不会保存您选择的名称的正确位置.例如,如果我开始键入"Adam"并进入"Ada"并选择它,如果我退格键入"Carol",则选择"Ada"所处的位置.它收集了"亚当"在点击时所处的位置(比方说2),当列表恢复时,检查位置(2),即使亚当不在那里.我需要一种方法来收集名称..然后当再次恢复或搜索列表时,将检查NAME Adam,而不是之前的位置亚当.除了创建大量数组之外,我绝对没有任何想法,并且可以真正使用一些帮助.下面是我正在使用的一些代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contacts_list);
myListView = (ListView)findViewById(android.R.id.list);
search_EditText = (EditText) findViewById(R.id.search_EditText);
search_EditText.addTextChangedListener(filterTextWatcher);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, ContactsList);
setListAdapter(adapter);
myListView.setItemsCanFocus(false);
getListView().setChoiceMode(2);
myListView.setTextFilterEnabled(true);
myListView.setFastScrollEnabled(true);
myListView.invalidate();
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
}
};
Run Code Online (Sandbox Code Playgroud) android android-searchmanager multiple-choice android-listview
我在我的应用程序中使用SearchManager实现了两个不同的搜索活动.一个是整个应用程序的默认搜索,另一个仅用于一个活动.这两个搜索执行不同数据的查找,并且在两个不同的搜索中共享搜索历史没有意义.这两个不同的搜索在应用程序中功能正常,我的问题是最近的搜索历史.
问题是在应用程序中定义了两个不同的SearchRecentSuggestionsProvider类,但是在一个搜索的最近搜索建议历史记录中显示了一个搜索.我已阅读开发指南中的SearchManager主题,但未看到有关多个建议提供程序的任何信息.
以下是AndroidManifest.xml中节点中的两个提供程序:
<provider android:name=".SearchOneRecentSuggestionsProvider"
android:authorities="com.company.SearchOneRecentSuggestionsProvider"></provider>
<provider android:name=".SearchTwoRecentSuggestionsProvider"
android:authorities="com.company.SearchTwoRecentSuggestionsProvider"></provider>
Run Code Online (Sandbox Code Playgroud)
这是SearchOneRecentSuggestionsProvider.java中定义的类:
package com.company;
import android.content.SearchRecentSuggestionsProvider;
public class SearchOneRecentSuggestionsProvider extends SearchRecentSuggestionsProvider {
public final static String AUTHORITY = "com.company.SearchOneRecentSuggestionsProvider";
public final static int MODE = DATABASE_MODE_QUERIES;
public SearchOneRecentSuggestionsProvider() {
setupSuggestions(AUTHORITY, MODE);
}
}
Run Code Online (Sandbox Code Playgroud)
(SearchTwoRecentSuggestionsProvider类看起来完全相同,除了替换One with Two并且在它自己的SearchTwoRecentSuggestionsProvider.java文件中.)
以下是搜索建议数据库中的内容(位于/data/data/com.company/databases/suggestions.db):
# sqlite3 suggestions.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> .tables
android_metadata suggestions
sqlite> .schema suggestions
CREATE TABLE suggestions (_id INTEGER PRIMARY KEY,display1 TEXT UNIQUE ON CONFLICT REPLACE,query TEXT,date LONG); …Run Code Online (Sandbox Code Playgroud) 我想实现一个搜索功能,打开默认浏览器并搜索传递的字符串
public void searchOnGoogle(String keywords){
---
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用意图过滤器或我必须自己实现一切?
我按照Android API指南中的说明设置了SearchWidget .它在操作栏中正确显示放大镜图标,如果我单击它,它会在操作栏(具有深色背景的输入字段)中启动搜索窗口小部件.
但是,如果我按下虚拟设备的搜索按钮,则会启动另一个搜索字段:它具有白色背景,并且不会调用我指定的回调方法.
所以我把它添加到我的MainActivity类:
public boolean onSearchRequested() {
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setIconified(!searchView.isIconified());
return false;
}
Run Code Online (Sandbox Code Playgroud)
搜索小部件的设置与文档中描述的完全相同:
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setOnQueryTextListener(new CustomSearchQueryTextListener());
Run Code Online (Sandbox Code Playgroud)
我的searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name">
</searchable>
Run Code Online (Sandbox Code Playgroud)
和AndroidManifest.xml:
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:uiOptions="splitActionBarWhenNarrow" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
</activity>
Run Code Online (Sandbox Code Playgroud)
我尝试使用setIconfied()方法的原因是,在Android API指南中,它说"切换搜索框可见性的能力":
"默认情况下,搜索小部件是"图标化",意味着它仅由搜索图标(放大镜)表示,并在用户触摸时展开以显示搜索框.如上所示,您可以显示搜索默认情况下,通过调用setIconifiedByDefault(false).您还可以通过调用setIconified()来切换搜索小部件外观."
我也试着打电话startSearch("", false, null, false);但这会带来与白色背景相同的搜索字段.
所以我的问题是:如果用户按下设备的搜索按钮,是否可以在操作栏中启动搜索小部件,即执行与单击搜索菜单项完全相同的操作?
我SearchView在Actionbar中有一个,我希望从服务中获取建议.
我在android中看过一个示例Samples Searchable Dictionary.但是它正在从本地数据库加载结果.
我明白了,有必要使用Content Provider.但我想知道何时从Web服务获取结果.我的意思是什么时候打网络.请任何人都可以帮忙.
在我的应用程序中,与许多其他应用程序一样,有一个常见的搜索小部件(http://developer.android.com/guide/topics/search/search-dialog.html#UsingSearchWidget).
只有当按下键盘上的搜索按钮时,我才会更改片段(并将搜索词传递给它).
我试过了
searchView.setOnSearchClickListener(new OnClickListener() {
@Override public void onClick(View v) {
} });
Run Code Online (Sandbox Code Playgroud)
但是当你按下操作栏上的按钮时会触发它,它会解锁搜索输入,而不会在点击键盘按钮搜索时触发.
你知道怎么可能吗?
我有一个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)
Run Code Online (Sandbox Code Playgroud)
我只有一个URL.哪种选择最适合我?
这是class我在做这个的地方:
public class …Run Code Online (Sandbox Code Playgroud) 您好我正在使用android 3.0 搜索小部件(不是搜索模式),问题是我需要传递一些参数和搜索词.
Android没有调用任何这些
searchManager.setOnDismissListener( new OnDismissListener() {
@Override
public void onDismiss() {
// TODO Auto-generated method stub
Log.v(MyApp.TAG, "on dismiss search");
}
});
searchManager.setOnCancelListener( new OnCancelListener() {
@Override
public void onCancel() {
// TODO Auto-generated method stub
Log.v(MyApp.TAG, "on dismiss cancel");
}
});
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putLong("listino_id", this.listino_id);
this.startSearch(null, true, appData, false);
return true;
// return super.onSearchRequested();
}
Run Code Online (Sandbox Code Playgroud)
我需要我的活动不是 singleOnTop,这是我的AndroidManifest.xml
<activity android:name=".activity.ListinoProdottiActivity" android:windowSoftInputMode="stateHidden">
<!-- Receives the search request. -->
<intent-filter> …Run Code Online (Sandbox Code Playgroud) 我的用例如下:在活动A中,我有一个带有可折叠SearchView的操作栏.当用户提出查询并按下"搜索"按钮时,我想显示活动B的结果.我没有这样做,这是我的代码:
searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/action_search_hint"
android:label="@string/app_name"/>
Run Code Online (Sandbox Code Playgroud)
活动A:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
Run Code Online (Sandbox Code Playgroud)
活动A和B的AndroidManifest:
<activity
android:name=".ActivityA">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".ActivityB">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
Run Code Online (Sandbox Code Playgroud)
Howerver,无论我尝试什么,A中的getSearchableInfo始终返回null.
我感觉我不理解某些东西.我可以使getSearchableInfo()返回非null的唯一方法是将SEARCH意图过滤器和可搜索的元数据放入清单中的活动A. 但是,当我按下"搜索"按钮时,活动A的另一个实例再次在当前的实例之上启动,这绝对不是我想要的.我想我可以将singleTop添加到A并在onNewIntent中处理SEARCH动作并启动B,但我通常不希望A成为singleTop,我想要默认值.或者我呢?
我尝试在清单中将其添加到A中(如其他一些线程所示):
<meta-data
android:name="android.app.default_searchable"
android:value=".ActivityB" >
</meta-data>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
编辑:我用A替换了A中的'getComponentName()'行:
searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, ActivityB.class)));
Run Code Online (Sandbox Code Playgroud)
它似乎按我想要的方式工作!我在这里做错了什么,或者这是正确的方法吗?我有点不确定,因为它在任何地方都没有提到!
我正在编写一个启动器,并希望能够在Google App中将搜索作为叠加而不是全屏打开.
到目前为止,我只找到了一种在Google App全屏幕中打开搜索的方法,如下所示(取自AOSP Launcher3源代码):
public static boolean openSearch(Context context) {
SearchManager searchManager = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE);
ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity();
if (globalSearchActivity == null) {
Timber.w("No global search activity found.");
return false;
}
Intent intent = new Intent(android.app.SearchManager.INTENT_ACTION_GLOBAL_SEARCH);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(globalSearchActivity);
Bundle appSearchData = new Bundle();
appSearchData.putString("source", "launcher-search");
intent.putExtra(android.app.SearchManager.APP_DATA, appSearchData);
intent.putExtra(android.app.SearchManager.QUERY, "");
intent.putExtra(android.app.SearchManager.EXTRA_SELECT_QUERY, true);
try {
context.startActivity(intent);
return true;
} catch (ActivityNotFoundException ex) {
Timber.w("Global search activity not found: %s", globalSearchActivity);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这是可能的,因为像Nova和Action Launcher这样的其他发射器设法做到了......