【问题标题】:SearchView getActionView returning nullSearchView getActionView 返回 null
【发布时间】:2013-08-26 18:16:20
【问题描述】:

这在几天前还有效,但突然停止了。我只想在某些片段可见时使用操作栏搜索小部件。

现在我无法获取 SearchView,现在 getActionView 总是返回 null。

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="@string/search_for_places">
</searchable>

Manifest.xml

<activity
    android:name=".ui.activities.MainActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
        <action android:name="android.intent.action.SEARCH"/>
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable"/>
    <meta-data
    android:name="android.app.default_searchable"
    android:value=".ui.activities.MainActivity" />
</activity>

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:myapp="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search_place"
        android:icon="@drawable/ic_2_action_search"
        android:orderInCategory="1"
        android:title="@string/title_search"
        myapp:showAsAction="collapseActionView|ifRoom"
        myapp:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

片段

...
setHasOptionsMenu(true);
...



@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    inflater.inflate(R.menu.menu, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search_place);
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);

    SearchManager searchManager = (SearchManager) getBaseActivity().getSystemService(Context.SEARCH_SERVICE);
    if (mSearchView != null) {
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
        mSearchView.setIconifiedByDefault(true);
        mSearchView.setOnQueryTextListener(this);
    }
    super.onCreateOptionsMenu(menu, inflater);
}

【问题讨论】:

    标签: android android-searchmanager android-support-library


    【解决方案1】:

    我遇到了同样的问题,因为在我的菜单中我使用了: android:actionViewClass="android.widget.SearchView" 根据谷歌文档。

    事实证明,如果我使用 AppCompatActivity,我应该使用 app:actionViewClass="android.widget.SearchView" 而是。

    希望这对某人有所帮助。

    【讨论】:

    • 感谢您的帮助。在遇到您的答案之前,我被困了好几个小时。
    • 非常感谢。它拯救了我的一天
    • 我用过app:actionViewClass="android.support.v7.widget.SearchView"
    • @Phil795 很高兴为您提供帮助! =)
    • 是的,这对我有帮助!谢谢 Maxadron。
    【解决方案2】:

    如果您使用 proguard,这可能是答案:https://code.google.com/p/android/issues/detail?id=58508

    简而言之,将以下行添加到您的 proguard 配置文件 proguard-rules.pro

    -keep class android.support.v7.widget.SearchView { *; }
    

    【讨论】:

    • 很明显,但我还是要提一下 - 如果您已将 SearchView 扩展到另一个类,请在 proguard 中保留该类的路径!
    • 谢谢伙计。我从 3 天开始就面临这个问题。进行了所有更改,但无法识别错误。这就是问题所在。
    【解决方案3】:

    今天我遇到了同样的问题,我想我解决了。事实证明,我做了几件不完全符合ActionBarCompat 合同的事情:

    • 每个使用ActionBarCompat 的活动都应该直接扩展ActionBarActivity 而不是FragmentActivity
    • 使用ActionBarCompat 的每个活动都应将其主题声明为继承自ActionBarCompat 主题。

    我发现这两个人都在观看来自 Google 的 explanation video

    现在我的searchView 不再是null

    【讨论】:

    • 它通过使用主题 Theme.AppCompat 而不是 Theme.Base.AppCompat 解决了我的问题
    • 我的问题是 Proguard。如果您启用了 Proguard,请确保您有一个保留 android.support.v7.widget.SearchView 的规则。例如,要保留所有不同版本的支持库中的所有内容,请添加 -keep class android.support.** { *; }-keep interface android.support.** { *; }
    • 指定动作类对我的情况有所帮助:app:actionViewClass="android.support.v7.widget.ActionMenuView"
    • @kip2 app: 解决了我不使用 support.v7 的问题。谢谢!
    • @ashughes 您的 proguard 答案应该是答案。多谢! :)
    【解决方案4】:

    我修复了它:在菜单 xml 中,我使用了 app 命名空间

    对于 androidx 库的用户:

        app:showAsAction="collapseActionView|always"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
    

    对于旧支持库的用户:

        app:showAsAction="collapseActionView|always"
        app:actionViewClass="android.support.v7.widget.SearchView"
    

    Android 教程https://developer.android.com/training/search/setup.html 使用框架SearchView 而不是androidx/support 库之一,因此它使用android:showAsandroid:actionView

    【讨论】:

      【解决方案5】:

      改导入android.support.v7.widget.SearchView帮了我

      【讨论】:

        【解决方案6】:

        我遇到了同样的错误。我做了以下事情:

        我有一个通过 FragmentActivity 扩展的 Activity:

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.feed, menu);
        
            // Associate searchable configuration with the SearchView
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
                    .getActionView();
            searchView.setSearchableInfo(searchManager
                    .getSearchableInfo(getComponentName()));
        
            return true;
        }
        

        可搜索的.xml:

        <?xml version="1.0" encoding="utf-8"?>
        <searchable xmlns:android="http://schemas.android.com/apk/res/android"
            android:label="@string/app_label"
            android:hint="@string/search_hint" >
        </searchable>
        

        Menu.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="br.com.srtorcedor.FeedActivity">
        
            <item android:id="@+id/action_search"
                android:icon="@drawable/abc_ic_search"
                android:title="@string/search_title"
                android:showAsAction="always"
                android:actionViewClass="android.widget.SearchView"/>
        
        </menu>
        

        AndroidManifest:

          <activity
                android:name=".FeedActivity"
                android:icon="@drawable/ic_action_pins"
                android:label="@string/title_activity_feed">
                <intent-filter>
                    <action android:name="android.intent.action.SEARCH" />
                </intent-filter>
                <meta-data
                    android:name="android.app.searchable"
                    android:resource="@xml/searchable" />
            </activity>
        

        你能检查一下它是否适合你吗?

        【讨论】:

          【解决方案7】:

          今天我发现我在 getActionView() 调用没有的项目时得到了 null:

          android:showAsAction="always"
          

          否则它们似乎无法正确充气。

          【讨论】:

            【解决方案8】:

            对我来说,以下解决方案有效:

            <?xml version="1.0" encoding="utf-8"?>
            <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.dev.ttburger.conttagem.BuscarProdutoActivity">
                <item
                    android:id="@+id/search"
                    android:icon="@drawable/ic_search"
                    android:title="Buscar"
                    app:showAsAction="always"   
                    app:actionViewClass="android.support.v7.widget.SearchView"/>
            </menu>
            

            改为:

            <?xml version="1.0" encoding="utf-8"?>
            <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.dev.ttburger.conttagem.BuscarProdutoActivity">
                <item
                    android:id="@+id/search"
                    android:icon="@drawable/ic_search"
                    android:title="Buscar"
                    app:showAsAction="always"   
                    app:actionViewClass="android.SearchView"/>
            </menu>
            

            【讨论】:

              【解决方案9】:

              我也添加了这个:

              setHasOptionsMenu(true);
              

              使用这个和 @maxandron 回答

              【讨论】:

                猜你喜欢
                • 2015-11-08
                • 1970-01-01
                • 2015-01-29
                • 2020-11-25
                • 2012-12-15
                • 1970-01-01
                • 2017-12-31
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多