为什么android.support.v7.widget.SearchView无法显示在操作栏上?

时间:2015-01-19 14:37:30

标签: android

enter image description here

点击搜索按钮后,没有任何反应。搜索框没有出现.Below是我的menu.xml。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
            android:showAsAction="ifRoom|collapseActionView"
          android:actionViewClass="android.support.v7.widget.SearchView" />
    <item android:id="@+id/action_compose"
          android:icon="@drawable/ic_action_compose"
          android:title="@string/action_compose"
           android:showAsAction="never"  />
</menu>

虽然搜索窗口小部件未显示在操作栏上,但在方法 onCreateOptionsMenu 中添加以下代码之前没有抛出异常。

MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

详细例外如下。

01-19 14:17:00.222: W/ResourceType(2064): No package identifier when getting value for resource number 0x00000000
01-19 14:17:00.222: W/MenuInflater(2064): Cannot instantiate class: android.support.v7.widget.SearchView
01-19 14:17:00.222: W/MenuInflater(2064): java.lang.reflect.InvocationTargetException
01-19 14:17:00.222: W/MenuInflater(2064):   at java.lang.reflect.Constructor.newInstance(Native Method)
01-19 14:17:00.222: W/MenuInflater(2064):   at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.view.MenuInflater$MenuState.newInstance(MenuInflater.java:514)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.view.MenuInflater$MenuState.setItem(MenuInflater.java:471)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:493)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.view.MenuInflater.parseMenu(MenuInflater.java:189)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.view.MenuInflater.inflate(MenuInflater.java:110)
01-19 14:17:00.222: W/MenuInflater(2064):   at com.example.android.effectivenavigation.MainActivity.onCreateOptionsMenu(MainActivity.java:215)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.app.Activity.onCreatePanelMenu(Activity.java:2820)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275)
01-19 14:17:00.222: W/MenuInflater(2064):   at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:548)
01-19 14:17:00.222: W/MenuInflater(2064):   at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:917)
01-19 14:17:00.222: W/MenuInflater(2064):   at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:258)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.os.Handler.handleCallback(Handler.java:739)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.os.Handler.dispatchMessage(Handler.java:95)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.os.Looper.loop(Looper.java:135)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.app.ActivityThread.main(ActivityThread.java:5221)
01-19 14:17:00.222: W/MenuInflater(2064):   at java.lang.reflect.Method.invoke(Native Method)
01-19 14:17:00.222: W/MenuInflater(2064):   at java.lang.reflect.Method.invoke(Method.java:372)
01-19 14:17:00.222: W/MenuInflater(2064):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
01-19 14:17:00.222: W/MenuInflater(2064):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
01-19 14:17:00.222: W/MenuInflater(2064): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0
01-19 14:17:00.222: W/MenuInflater(2064):   at android.content.res.Resources.getValue(Resources.java:1233)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.content.res.Resources.loadXmlResourceParser(Resources.java:2598)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.content.res.Resources.getLayout(Resources.java:1049)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.view.LayoutInflater.inflate(LayoutInflater.java:412)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.support.v7.widget.SearchView.<init>(SearchView.java:282)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.support.v7.widget.SearchView.<init>(SearchView.java:268)
01-19 14:17:00.222: W/MenuInflater(2064):   at android.support.v7.widget.SearchView.<init>(SearchView.java:264)
01-19 14:17:00.222: W/MenuInflater(2064):   ... 21 more

1 个答案:

答案 0 :(得分:5)

  

我使用了appcompat-v7

然后你应该没有这样做:

  

我导入的是导入android.app.ActionBar;

这是本机操作栏,而不是后端。也:

  • 您需要继承ActionBarActivity,而不是FragmentActivity

  • 您需要将android:showAsActionandroid:actionViewClass更改为app:showAsActionapp:actionViewClass

例如,here is a sample project使用SearchView中的appcompat-v7

该项目的菜单资源是:

<?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">

    <item
        android:id="@+id/search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@drawable/ic_action_search"
        app:showAsAction="ifRoom|collapseActionView"
        android:title="@string/filter">
    </item>

</menu>

请注意appactionViewClass使用showAsAction前缀。