我需要在我的项目中创建一个Google Play并使用带有过滤器的搜索栏进行映射,但我不知道如何开始.我通过自己的自定义实现尝试了它,如下所示:
在ToolBar android中自动完成TextView
MainActivity.java
toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar (toolbar);
ArrayList<String> searchArrayList = new ArrayList<String>();
searchArrayList.add("United States");
searchArrayList.add("France");
searchArrayList.add("United Kingdom");
searchArrayList.add("India");
searchArrayList.add("Indonesia");
searchArrayList.add("Germany");
searchArrayList.add("Spain");
AutoCompleteAdapter adapter = new AutoCompleteAdapter(this,
R.layout.list_item, R.id.textView1, searchArrayList);
AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.searchAutoComplete);
autoCompleteTextView.setDropDownWidth(getResources().getDisplayMetrics().widthPixels);
autoCompleteTextView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
使用ArrayAdapter自定义AutoCompleteAdapter类实现
AutoCompleteAdapter.java
public class AutoCompleteAdapter extends ArrayAdapter<String> implements
Filterable {
private ArrayList<String> fullList;
private ArrayList<String> mOriginalValues;
private ArrayFilter mFilter;
public AutoCompleteAdapter(Context context, int resource,
int textViewResourceId, ArrayList<String> fullList) {
super(context, resource, textViewResourceId, fullList);
this.fullList = fullList;
mOriginalValues = new ArrayList<String>(fullList); …Run Code Online (Sandbox Code Playgroud) android android-actionbar android-search material-design android-toolbar
"限制"的最佳方法是什么,onQueryTextChange以便我的performSearch()方法每秒只调用一次而不是每次用户输入?
public boolean onQueryTextChange(final String newText) {
if (newText.length() > 3) {
// throttle to call performSearch once every second
performSearch(nextText);
}
return false;
}
Run Code Online (Sandbox Code Playgroud) 几天前我注意到我输入的文字SearchView没有显示出来.也许这个问题在很久以前开始了,我没有注意到它,但我知道当我第一次设置搜索功能时,一切都运行良好.
这是一个截图(我已经输入了文本,你可以看到它没有显示):
我已经尝试SearchView用这个SO问题改变文本的颜色,并且我也尝试在我的可搜索配置XML文件中更改文本颜色.在我发现这些都不起作用后,我撤消了我的更改,以便您可以看到我目前在下面的代码:
MainActivity.java
@Override
public boolean onCreateOptionsMenu(Menu) {
...
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchResultsActivity.class)));
// Note: getSearchableInfo(getComponentName()) will not work on all flavours
// because of a difference in app IDs
}
Run Code Online (Sandbox Code Playgroud)
请注意,我使用的是new ComponentName(...)代替,getSearchableInfo(getComponentName())因为我在不同的口味中使用不同的包名称.
上面的活动SearchView是显示的位置.结果显示在另一项活动中.
searchable.xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint" />
Run Code Online (Sandbox Code Playgroud)
AndroidManifest.xml中
...
<activity
android:name=".ui.MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme">
<meta-data …Run Code Online (Sandbox Code Playgroud) 这听起来像一个重复的问题,但事实并非如此.
我正在尝试设置OnActionExpandListener我的搜索菜单项:
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_country_picker, menu);
MenuItem menuItem = menu.findItem(R.id.search);
menuItem.setOnActionExpandListener(this);
//more code
return true;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到这个例外:
java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.setOnActionExpandListener()
at android.support.v7.view.menu.MenuItemImpl.setOnActionExpandListener(MenuItemImpl.java:743)
at com.myapp.pages.country_picker.CountryPickerActivity.onCreateOptionsMenu(CountryPickerActivity.java:59)
at android.app.Activity.onCreatePanelMenu(Activity.java:3145)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:320)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:92)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:331)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:92)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
Run Code Online (Sandbox Code Playgroud)
很酷,让我们用MenuItemCompat.setOnActionExpandListener()吧!
这是我替换时menuItem.setOnActionExpandListener(this);得到的MenuItemCompat.setOnActionExpandListener(menuItem, this);:
java.lang.UnsupportedOperationException: This is not supported, …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
MenuItem searchItem = menu.findItem(R.id.searchMenuItem);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
// searchView.set
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
}
Run Code Online (Sandbox Code Playgroud)
我的最小API是8.
我有这个编译错误
Call requires API level 11 (current min is 8):
android.widget.SearchView#setSearchableInfo
Run Code Online (Sandbox Code Playgroud)
注意,我无法更改最低SDK.
android android-actionbar android-support-library android-search
在我的应用程序中,与许多其他应用程序一样,有一个常见的搜索小部件(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)
但是当你按下操作栏上的按钮时会触发它,它会解锁搜索输入,而不会在点击键盘按钮搜索时触发.
你知道怎么可能吗?
我的用例如下:在活动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)
它似乎按我想要的方式工作!我在这里做错了什么,或者这是正确的方法吗?我有点不确定,因为它在任何地方都没有提到!
我有一个主要活动有2个片段.主要活动SearchView在操作栏中有一个.这两个片段都有一个包含大量字符串的列表List<String>.
流程是:
用户输入片段I - >选择一个字符串(比如说Selection1) - >基于Selection1,在第二个片段中填充一个字符串列表 - >这里用户选择第二个字符串--->基于这两个处理字符串.
现在,由于两个片段都包含大量字符串,因此用户在SearchView其中输入一个查询,该查询过滤列表并将其缩小为显示在中的较小列表SearchableActivity.
现在的问题是如何SearchableActivity获取这两个访问权限以List<String>根据查询过滤它们并向用户显示缩减列表.
目前我所做的是被覆盖onSearchRequested并将数据传递为
@Override
public boolean onSearchRequested()
{
Bundle appData = new Bundle();
appData.putString(FRAGMENT_ID, "Fragment_A");
appData.putStringArrayList(SEARCH_LIST, searchList);
startSearch(null, false, appData, false);
return true;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法或标准方法来处理这个问题,即一个允许数据基于我的MainActivity实现SearchableActivity?
编辑:添加代码.显示数据的设置方式Fragment.onDataReceived从HttpManager接收数据的中调用.
@Override
public void onDataReceived(String type,final Object object)
{
switch(type)
{
case PopItConstants.UPDATE_LIST:
getActivity().runOnUiThread(new Runnable() {
@Override
public …Run Code Online (Sandbox Code Playgroud) android android-fragments android-activity searchview android-search
最近我一直在搞乱Android架构组件(更具体地说是Room),但我遇到了一些障碍.
我已经成功构建了一个Room数据库,用于存储部门及其人员的列表.以前,此数据是从服务器中提取的,但未在本地存储.搜索功能也是远程处理的,所以我现在也希望在本地处理搜索功能,但我对SQL的了解有点缺乏.
查看服务器上的SQL代码,搜索语句使用一堆REGEXP函数根据提供的查询搜索两个数据库.这似乎不是处理搜索的最佳方式,但它运作得相当好,并给出了快速响应.所以我尝试在本地模仿这个,但很快发现REGEXPAndroid上不支持(不使用NDK).
至于LIKE和GLOB运营商,他们似乎非常有限.例如,我没有看到一种方法可以同时匹配多个关键字; 而REGEXP我可以用一个or(|)运算符替换空格来实现这个功能.
所以,寻找替代方案我遇到了全文搜索(FTS); 这是Android文档中实现搜索的方法.虽然看起来FTS用于搜索完整文档,而不是像我的用例那样简单的数据.
无论如何,Room不支持 FTS .
所以,当然,我试图强制Room创建一个FTS虚拟表而不是一个标准表,通过创建一个实现SupportSQLiteOpenHelper.Factory就是这样.这个实现几乎是默认的直接副本FrameworkSQLiteOpenHelperFactory,以及相关的框架类.必要的代码位于SupportSQLiteDatabase,我覆盖execSQL以在必要时注入虚拟表代码.
class FTSSQLiteDatabase(
private val delegate: SQLiteDatabase,
private val ftsOverrides: Array<out String>
) : SupportSQLiteDatabase {
// Omitted code...
override fun execSQL(sql: String) {
delegate.execSQL(injectVirtualTable(sql))
}
override fun execSQL(sql: String, bindArgs: Array<out Any>) {
delegate.execSQL(injectVirtualTable(sql), bindArgs)
}
private fun …Run Code Online (Sandbox Code Playgroud) android full-text-search android-sqlite android-search android-room

在 上MainActivity.class,我调用了一个搜索对话框onSearchRequested()。它如何显示为上图。
我想删除那个主页/应用程序图标,但没有运气。请不要混淆我想删除操作栏上的主页/应用程序图标。不,这是我声明的搜索对话框SearchActivity.class
public class SearchableActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_searchable);
// Get the intent, verify the action and get the query
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}}
Run Code Online (Sandbox Code Playgroud)
并在 xml/searchable.xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">
Run Code Online (Sandbox Code Playgroud)
在 AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.default_searchable"
android:value=".SearchableActivity"/>
</activity>
<activity
android:name=".SearchableActivity" > …Run Code Online (Sandbox Code Playgroud) android ×10
android-search ×10
searchview ×4
android-menu ×1
android-room ×1
java ×1
search ×1