【问题标题】:Simple Android SearchView not functioning properly简单的 Android SearchView 无法正常运行
【发布时间】:2017-12-09 15:53:33
【问题描述】:

我正在尝试关注来自 android.com 的 search interface manual。我几乎没有问题,我不确定我到底做错了什么。

如果你想看,这里是project as zip 文件。

1- 当我触摸搜索图标时,android:hint 不可见。它是空的。为什么?如果我以编程方式设置它,例如。 searchView.setQueryHint(getString(R.string.search_hint)); 为什么它在 XML 中不起作用?

2- 当我触摸搜索图标时,搜索字段没有获得焦点并且键盘不会自动出现。我需要触摸搜索文本字段才能获得焦点。我相信它应该自动获得焦点?

3- 当我写东西并触摸键盘上的搜索图标时。我没有看到在 logcat 窗口中记录的任何日志条目。缺少什么?

4-(已解决)我在 XML 中尝试了 android:iconifiedByDefault="false"searchView.setIconifiedByDefault(false);,当我启动应用程序时它总是图标化。为什么会这样?

  • 我发现我需要从app:showAsAction 中删除collapseActionView,否则setIconifiedByDefault(false) 不起作用。此外,如果您删除 collapseActionView 并设置 setIconifiedByDefault(false),则它永远不会崩溃。

我猜我错过了什么地方,但我不确定到底是什么......

以下是我遵循的步骤:

我在 Android Studio 3 中使用“基本活动”启动了一个新项目。 它有一个现成的工具栏和中间的“Hello World”。

然后到xml文件夹我添加了searchable.xml文件内容:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="Search hint text"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">
</searchable>

然后更改AndroidManifest.xml文件并添加一个活动:

<activity android:name=".SearchableActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
        android:resource="@xml/searchable"/>
</activity>

然后创建了一个简单的SearchableActivity.class。只是为了记录一些行。

package com.test.myapplication;

import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class SearchableActivity extends ListActivity {
    private static String TAG = SearchableActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate");
        super.onCreate(savedInstanceState);

        handleIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {
        Log.d(TAG, "handleIntent");
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //use the query to search your data somehow
        }
    }
}

然后在现有的menu_main.xml 中添加必要的项:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.test.myapplication.MainActivity">
    <item android:id="@+id/search"
        android:title="@string/app_name"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.widget.SearchView" />
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never" />
</menu>

更新:如果我更改为app:actionViewClass="android.support.v7.widget.SearchView"MainActivity.class,如果我导入import android.support.v7.widget.SearchView;,那么当我点击搜索图标时,它会显示默认的Search... 文本会自动获得焦点。但不显示来自 XML 的提示,当我提交任何信息时仍然没有日志条目。

更新:

我意识到如果我将intent-filtermeta 部分放在MainActivity 下,我就会在主要活动中获得搜索意图。但我不明白为什么它不启动SearchableActivity。因为SearchView 的手册页清楚地写着:

当用户从搜索对话框或小部件执行搜索时,系统会启动您的可搜索活动并向其发送 ACTION_SEARCH 意图。

【问题讨论】:

    标签: android searchview


    【解决方案1】:

    显然我需要做的就是从onCreateOptionsMenu()转发更正活动的意图

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    ComponentName componentName = new ComponentName(this, SearchableActivity.class);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    if (searchManager != null)
        searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));
    

    【讨论】:

      【解决方案2】:

      使用这个

      app:actionViewClass="android.support.v7.widget.SearchView"
      

      不是这个

      app:actionViewClass="android.widget.SearchView"
      

      【讨论】:

      • 我试过了,它只是解决了 1 个问题。现在搜索字段获得焦点。
      • @EvrenYurtesen 试试这个 app:showAsAction="collapseActionView|always"
      • 没有区别。我的理解是always 表示操作不会进入菜单。但我发现我应该删除collapseActionView,它不会崩溃。无论如何,最大的问题是SearchView在我提交文本时似乎没有做任何事情,我不明白为什么?
      • @EvrenYurtesen 测试用例使用AppCompatActivity 而不是ListActivity
      • @EvrenYurtesen 我已经下载了试图打开的项目
      猜你喜欢
      • 2013-06-21
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多