【问题标题】:Cannot instantiate class: android.support.v7.widget.SearchView无法实例化类:android.support.v7.widget.SearchView
【发布时间】:2014-03-07 16:30:21
【问题描述】:

我正在尝试为我的应用程序使用SearchView。首先我将appcompat 添加到我的项目中:

 compile "com.android.support:appcompat-v7:19.0.1+"

我将这段代码添加到我的菜单中:

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

但是当我启动activity 时,我得到了这个:

03-07 17:25:39.110 16861-16861/de.treevo.app W/MenuInflater﹕不能 实例化类:android.support.v7.widget.SearchView java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 android.view.MenuInflater$MenuState.newInstance(MenuInflater.java:471) 在 android.view.MenuInflater$MenuState.setItem(MenuInflater.java:430) 在 android.view.MenuInflater$MenuState.addItem(MenuInflater.java:451) 在 android.view.MenuInflater.parseMenu(MenuInflater.java:188) 在 android.view.MenuInflater.inflate(MenuInflater.java:110) 在 de.treevo.app.search.onCreateOptionsMenu(search.java:260) 在 android.app.Activity.onCreatePanelMenu(Activity.java:2538) 在 com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:489) 在 com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:853) 在 com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:273) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:543) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 引起:android.view.InflateException:二进制 XML 文件第 41 行:膨胀类错误 在 android.view.LayoutInflater.createView(LayoutInflater.java:620) 在 com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 在 android.view.LayoutInflater.onCreateView(LayoutInflater.java:669) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:397) 在 android.support.v7.widget.SearchView.(SearchView.java:262) 在 android.support.v7.widget.SearchView.(SearchView.java:254) 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 android.view.MenuInflater$MenuState.newInstance(MenuInflater.java:471) 在 android.view.MenuInflater$MenuState.setItem(MenuInflater.java:430) 在 android.view.MenuInflater$MenuState.addItem(MenuInflater.java:451) 在 android.view.MenuInflater.parseMenu(MenuInflater.java:188) 在 android.view.MenuInflater.inflate(MenuInflater.java:110) 在 de.treevo.app.search.onCreateOptionsMenu(search.java:260) 在 android.app.Activity.onCreatePanelMenu(Activity.java:2538) 在 com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:489) 在 com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:853) 在 com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:273) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:543) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 android.view.LayoutInflater.createView(LayoutInflater.java:594) 在 com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 在 android.view.LayoutInflater.onCreateView(LayoutInflater.java:669) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:397) 在 android.support.v7.widget.SearchView.(SearchView.java:262) 在 android.support.v7.widget.SearchView.(SearchView.java:254) 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 android.view.MenuInflater$MenuState.newInstance(MenuInflater.java:471) 在 android.view.MenuInflater$MenuState.setItem(MenuInflater.java:430) 在 android.view.MenuInflater$MenuState.addItem(MenuInflater.java:451) 在 android.view.MenuInflater.parseMenu(MenuInflater.java:188) 在 android.view.MenuInflater.inflate(MenuInflater.java:110) 在 de.treevo.app.search.onCreateOptionsMenu(search.java:260) 在 android.app.Activity.onCreatePanelMenu(Activity.java:2538) 在 com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:489) 在 com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:853) 在 com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:273) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:543) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 引起:android.content.res.Resources$NotFoundException:资源不是可绘制的(颜色或路径): 类型值{t=0x2/d=0x7f010030 a=-1} 在 android.content.res.Resources.loadDrawable(Resources.java:2068) 在 android.content.res.TypedArray.getDrawable(TypedArray.java:602) 在 android.widget.ImageView.(ImageView.java:129) 在 android.widget.ImageView.(ImageView.java:119) 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 android.view.LayoutInflater.createView(LayoutInflater.java:594) 在 com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 在 android.view.LayoutInflater.onCreateView(LayoutInflater.java:669) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:397) 在 android.support.v7.widget.SearchView.(SearchView.java:262) 在 android.support.v7.widget.SearchView.(SearchView.java:254) 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 android.view.MenuInflater$MenuState.newInstance(MenuInflater.java:471) 在 android.view.MenuInflater$MenuState.setItem(MenuInflater.java:430) 在 android.view.MenuInflater$MenuState.addItem(MenuInflater.java:451) 在 android.view.MenuInflater.parseMenu(MenuInflater.java:188) 在 android.view.MenuInflater.inflate(MenuInflater.java:110) 在 de.treevo.app.search.onCreateOptionsMenu(search.java:260) 在 android.app.Activity.onCreatePanelMenu(Activity.java:2538) 在 com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:489) 在 com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:853) 在 com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:273) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:543) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

当我按下搜索图标时,什么也没有发生:(

编辑1:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.offline, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) searchItem.getActionView();
    //setupSearchView(searchItem);

   // menu.findItem(R.id.action_search).getActionView();

    return true;
}

【问题讨论】:

    标签: java android android-appcompat


    【解决方案1】:

    在我的情况下,它在开发模式下工作,但在发布模式下崩溃(导出签名的 apk)。要解决这个问题,请将此行添加到proguard-rules.txt

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

    【讨论】:

      【解决方案2】:

      尝试在布局中添加自定义前缀,例如:

      <?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/action_search"
                android:title="@string/search"
                android:icon="@drawable/ic_action_search"
                app:showAsAction="ifRoom|collapseActionView"
                app:actionViewClass="android.support.v7.widget.SearchView" />
      
      </menu>  
      

      参见the documentation,在示例中,您必须添加自定义前缀(如上面代码中的“app”)。


      另外,代替:

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

      试试这个:

      MenuItem searchItem = menu.findItem(R.id.action_search);
      // with MenuItemCompat instead of your MenuItem
      mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);  
      

      如果这有帮助,请告诉我。

      【讨论】:

      • 什么也没发生。就像“app”没有效果的所有东西一样
      • 这不是“app”的全部,只有 xmlns (res-auto)、showAsAction 和 actionViewClass 属性。您可以使用onCreateOptionsMenu 中的代码编辑您的问题吗?
      • 谢谢 :) 刚刚将 MenuItem 更改为 MenuItemCompat 并将 Activity 更改为 ActionBarActivity
      • 我也做了同样的事情,但问题仍然存在..帮助我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2014-12-21
      • 2018-02-02
      • 1970-01-01
      相关资源
      最近更新 更多