简体   繁体   English

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

[英]why android.support.v7.widget.SearchView can not be shown on the actionbar?

在此处输入图片说明

After I clicked the search button, nothing happened. 单击搜索按钮后,没有任何反应。 The search box does not occur.Below is my menu.xml. 不会出现搜索框。下面是我的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>

Although the search widget was not shown on the action bar, but there was no exception thrown until I added the following code in method onCreateOptionsMenu . 尽管搜索窗口小部件未显示在操作栏上,但是直到在onCreateOptionsMenu方法中添加以下代码之前,都不会引发异常。

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

The detailed exception is below. 详细的例外情况如下。

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

I used the appcompat-v7 我使用了appcompat-v7

Then you should have not done this: 然后,您不应该这样做:

what I imported was import android.app.ActionBar; 我导入的是import android.app.ActionBar;

That is the native action bar, not the backport. 那是本机操作栏,而不是反向端口。 Also: 也:

  • you need to inherit from ActionBarActivity , not FragmentActivity , and 您需要继承ActionBarActivity ,而不是FragmentActivity ,并且

  • you need to change android:showAsAction and android:actionViewClass to app:showAsAction and app:actionViewClass 您需要将android:showAsActionandroid:actionViewClassapp:showAsActionapp:actionViewClass

For example, here is a sample project that uses SearchView from appcompat-v7 . 例如, 这是一个使用来自appcompat-v7 SearchView 的示例项目

The menu resource from that project is: 该项目的菜单资源为:

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

Note the use of the app prefixes for actionViewClass and showAsAction . 注意actionViewClassshowAsActionapp前缀的使用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM