标签: android-search

实现谷歌播放和搜索栏android等地图

我需要在我的项目中创建一个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

9
推荐指数
0
解决办法
4886
查看次数

在SearchView中调节onQueryTextChange

"限制"的最佳方法是什么,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)

java search android searchview android-search

9
推荐指数
4
解决办法
4505
查看次数

SearchView中的文本输入不显示

几天前我注意到我输入的文字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)

android searchview android-search

9
推荐指数
2
解决办法
2665
查看次数

无法设置OnActionExpandListener:不支持此功能,请使用MenuItemCompat.setOnActionExpandListener()

这听起来像一个重复的问题,但事实并非如此.

我正在尝试设置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)

android android-menu android-support-library android-search

9
推荐指数
1
解决办法
1399
查看次数

Android使用支持库来支持SearchView

这是我的代码:

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

8
推荐指数
1
解决办法
4489
查看次数

ActionBar上的Android SearchView,检测点击搜索

在我的应用程序中,与许多其他应用程序一样,有一个常见的搜索小部件(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)

但是当你按下操作栏上的按钮时会触发它,它会解锁搜索输入,而不会在点击键盘按钮搜索时触发.

你知道怎么可能吗?

android android-searchmanager android-search

8
推荐指数
1
解决办法
1万
查看次数

SearchView在一个活动中产生另一个活动

我的用例如下:在活动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)

它似乎按我想要的方式工作!我在这里做错了什么,或者这是正确的方法吗?我有点不确定,因为它在任何地方都没有提到!

android android-searchmanager android-search

7
推荐指数
1
解决办法
4365
查看次数

将搜索数据传递给Searchable Activity

我有一个主要活动有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.onDataReceivedHttpManager接收数据的中调用.

@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

7
推荐指数
1
解决办法
954
查看次数

用房间实现搜索

最近我一直在搞乱Android架构组件(更具体地说是Room),但我遇到了一些障碍.

我已经成功构建了一个Room数据库,用于存储部门及其人员的列表.以前,此数据是从服务器中提取的,但未在本地存储.搜索功能也是远程处理的,所以我现在也希望在本地处理搜索功能,但我对SQL的了解有点缺乏.

查看服务器上的SQL代码,搜索语句使用一堆REGEXP函数根据提供的查询搜索两个数据库.这似乎不是处理搜索的最佳方式,但它运作得相当好,并给出了快速响应.所以我尝试在本地模仿这个,但很快发现REGEXPAndroid上不支持(不使用NDK).

至于LIKEGLOB运营商,他们似乎非常有限.例如,我没有看到一种方法可以同时匹配多个关键字; 而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

7
推荐指数
2
解决办法
3607
查看次数

android 搜索界面 - 如何在调用 onSearchRequested() 时删除应用程序图标

在 ActionBar 上扩展 SearchView 小部件

在 上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 searchview android-search

6
推荐指数
1
解决办法
1357
查看次数