Подтвердить что ты не робот

Невозможно создать экземпляр класса: android.support.v7.widget.SearchView

Я пытаюсь использовать SearchView для моего приложения. Сначала я добавил appcompat в свой проект:

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

secound добавить этот код в свое меню:

<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: Can not экземпляр класса: android.support.v7.widget.SearchView     java.lang.reflect.InvocationTargetException             в java.lang.reflect.Constructor.newInstance(собственный метод)             на 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)             at 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)             at com.android.internal.policy.impl.PhoneWindow $1.run(PhoneWindow.java:273)             на android.view.Choreographer $CallbackRecord.run(Хореограф.ява: 761)             на android.view.Choreographer.doCallbacks(Хореограф .java:574)             на android.view.Choreographer.doFrame(Хореограф .java:543)             на android.view.Choreographer $FrameDisplayEventReceiver.run(Хореограф.ява: 747)             на android.os.Handler.handleCallback(Handler.java:733)             на android.os.Handler.dispatchMessage(Handler.java:95)             на android.os.Looper.loop(Looper.java:136)             at android.app.ActivityThread.main(ActivityThread.java:5017)             в java.lang.reflect.Method.invoke(собственный метод)             at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:779)             at 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(собственный метод) на 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) at 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) at com.android.internal.policy.impl.PhoneWindow $1.run(PhoneWindow.java:273) на android.view.Choreographer $CallbackRecord.run(Хореограф.ява: 761) на android.view.Choreographer.doCallbacks(Хореограф .java:574) на android.view.Choreographer.doFrame(Хореограф .java:543) на android.view.Choreographer $FrameDisplayEventReceiver.run(Хореограф.ява: 747) на android.os.Handler.handleCallback(Handler.java:733) на android.os.Handler.dispatchMessage(Handler.java:95) на android.os.Looper.loop(Looper.Java: 136) at android.app.ActivityThread.main(ActivityThread.java:5017) в java.lang.reflect.Method.invoke(собственный метод) at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)      Вызывается: java.lang.reflect.InvocationTargetException             в java.lang.reflect.Constructor.newInstance(собственный метод)             на 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(собственный метод) на 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) at 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) at com.android.internal.policy.impl.PhoneWindow $1.run(PhoneWindow.java:273) на android.view.Choreographer $CallbackRecord.run(Хореограф.ява: 761) на android.view.Choreographer.doCallbacks(Хореограф .java:574) на android.view.Choreographer.doFrame(Хореограф .java:543) на android.view.Choreographer $FrameDisplayEventReceiver.run(Хореограф.ява: 747) на android.os.Handler.handleCallback(Handler.java:733) на android.os.Handler.dispatchMessage(Handler.java:95) на android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) в java.lang.reflect.Method.invoke(собственный метод) at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)      Вызывается: android.content.res.Resources $NotFoundException: ресурс не является Drawable (цвет или путь): TypedValue {t = 0x2/d = 0x7f010030 a = -1}             на android.content.res.Resources.loadDrawable(Resources.java:2068)             at 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(собственный метод) на 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(собственный метод) на 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) at 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) at com.android.internal.policy.impl.PhoneWindow $1.run(PhoneWindow.java:273) на android.view.Choreographer $CallbackRecord.run(Хореограф.ява: 761) на android.view.Choreographer.doCallbacks(Хореограф .java:574) на android.view.Choreographer.doFrame(Хореограф .java:543) на android.view.Choreographer $FrameDisplayEventReceiver.run(Хореограф.ява: 747) на android.os.Handler.handleCallback(Handler.java:733) на android.os.Handler.dispatchMessage(Handler.java:95) на android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) в java.lang.reflect.Method.invoke(собственный метод) at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

и когда я нажимаю значок поиска, ничего не происходит: (

Edit1:

@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;
}
4b9b3361

Ответ 1

Попробуйте добавить пользовательский префикс на ваш макет, например:

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

Смотрите документацию, в этом примере вы должны добавить пользовательский префикс (как "приложение" в приведенном выше коде).


Кроме того, вместо:

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);  

Сообщите мне, если это поможет.

Ответ 2

В моем случае он работает в режиме разработки, но сбой в режиме выпуска (экспорт подписанный apk). Чтобы исправить это, добавьте эту строку в proguard-rules.txt

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