【问题标题】:Android SearchView does not work安卓搜索视图不起作用
【发布时间】:2014-09-04 08:33:10
【问题描述】:

我尝试更新所有库,但仍然出现错误。我可以在模拟器上运行应用程序,但是当我导出 APK 并在真正的 android 设备上运行它时,应用程序无法运行。

MinSdkVersion 为 8,targetSdkVersion 为 19。 请帮忙!!!

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:example="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_showTC"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="Terms and Conditions"/>

    <item android:id="@+id/action_search"
          android:title="Search"
          android:orderInCategory="100"
          example:showAsAction="ifRoom|collapseActionView"
          example:actionViewClass="android.support.v7.widget.SearchView"/>

</menu>

搜索视图

@Override
public boolean onOptionsItemSelected(MenuItem item){
    if(item.getItemId() == R.id.action_showTC){
        startActivity(new Intent(MainActivity.this, T_C.class));
        return true;
    }else{
        return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SupportMenuItem searchMenuItem = ((SupportMenuItem) menu.findItem(R.id.action_search));
    SearchView searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    return super.onCreateOptionsMenu(menu);
}

清单

    <activity android:name="com.agehk.queue.SearchResultsActivity"
        android:parentActivityName="com.agehk.queue.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>

searchable.xml

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

错误

09-04 15:57:13.105: W/SupportMenuInflater(17184): Cannot instantiate class: android.support.v7.widget.SearchView
09-04 15:57:13.105: W/SupportMenuInflater(17184): java.lang.NoSuchMethodException: <init> [class android.content.Context]
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at java.lang.Class.getConstructorOrMethod(Class.java:423)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at java.lang.Class.getConstructor(Class.java:397)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.internal.view.f.a(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.internal.view.f.a(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.internal.view.f.b(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.internal.view.d.a(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.internal.view.d.inflate(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at com.agehk.queue.MainActivity.onCreateOptionsMenu(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.app.Activity.onCreatePanelMenu(Activity.java:2577)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v4.app.j.onCreatePanelMenu(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.a.g.a(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.a.n.a(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.a.g.onCreatePanelMenu(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.support.v7.a.o.onCreatePanelMenu(Unknown Source)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:414)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:777)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:199)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:835)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.view.Choreographer.doCallbacks(Choreographer.java:626)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.view.Choreographer.doFrame(Choreographer.java:589)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:821)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.os.Handler.handleCallback(Handler.java:730)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.os.Handler.dispatchMessage(Handler.java:92)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.os.Looper.loop(Looper.java:150)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at android.app.ActivityThread.main(ActivityThread.java:5390)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at java.lang.reflect.Method.invokeNative(Native Method)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at java.lang.reflect.Method.invoke(Method.java:525)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-04 15:57:13.105: W/SupportMenuInflater(17184):   at dalvik.system.NativeStart.main(Native Method)
09-04 15:57:13.105: D/AndroidRuntime(17184): Shutting down VM
09-04 15:57:13.105: W/dalvikvm(17184): threadid=1: thread exiting with uncaught exception (group=0x42f05500)
09-04 15:57:13.105: E/AndroidRuntime(17184): FATAL EXCEPTION: main
09-04 15:57:13.105: E/AndroidRuntime(17184): java.lang.NullPointerException
09-04 15:57:13.105: E/AndroidRuntime(17184):    at com.agehk.queue.MainActivity.onCreateOptionsMenu(Unknown Source)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.app.Activity.onCreatePanelMenu(Activity.java:2577)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.support.v4.app.j.onCreatePanelMenu(Unknown Source)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.support.v7.a.g.a(Unknown Source)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.support.v7.a.n.a(Unknown Source)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.support.v7.a.g.onCreatePanelMenu(Unknown Source)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.support.v7.a.o.onCreatePanelMenu(Unknown Source)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:414)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:777)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:199)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:835)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.view.Choreographer.doCallbacks(Choreographer.java:626)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.view.Choreographer.doFrame(Choreographer.java:589)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:821)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.os.Handler.handleCallback(Handler.java:730)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.os.Handler.dispatchMessage(Handler.java:92)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.os.Looper.loop(Looper.java:150)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at android.app.ActivityThread.main(ActivityThread.java:5390)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at java.lang.reflect.Method.invokeNative(Native Method)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at java.lang.reflect.Method.invoke(Method.java:525)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-04 15:57:13.105: E/AndroidRuntime(17184):    at dalvik.system.NativeStart.main(Native Method)
09-04 15:57:13.115: D/BatteryStatsImpl(445): noteStopWakeLocked com.google.android.gms isFromForeground = false
09-04 15:57:13.115: W/ActivityManager(445):   Force finishing activity com.agehk.queue/.MainActivity

【问题讨论】:

  • 您使用的 minsdk 级别是多少?

标签: android android-support-library searchview


【解决方案1】:

将以下代码添加到 proguard-rules.pro

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

【讨论】:

  • 工作 - 比 ActionbarActivity 更受欢迎。
  • 我得到一个未解析的类名。我没有包括一些东西吗
【解决方案2】:

对于 AndroidX searchview proguard,您必须使用:

-keep class androidx.appcompat.widget.SearchView { *; }

【讨论】:

  • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
【解决方案3】:

经过长时间的研究,这个问题的简单解决方案,即添加

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

在 AndroidStudio 的 app/proguard/android.proguard 文件中。

干杯!

【讨论】:

    【解决方案4】:

    对于 11 之前的 API,您应该在兼容模式下初始化操作栏项:

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            MenuItem searchMenuItem = menu.findItem(R.id.action_search);
            SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchMenuItem);
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
            return true;
        }
    

    更新:
    因此,我尝试在 API 8 模拟器和 4.4 KitKat 上重现它。不幸的是,我的 2.3.8 设备前一阵子变砖了,所以无法检查 API 低的硬件。我可以建议您:
    1.检查SearchView是从android.support.v7.widget.SearchView;导入的
    2. 检查菜单资源是否正确:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto" <----------- init compatible namespace
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".MainActivity" >
    
        <item
            android:id="@+id/action_showTC"
            android:orderInCategory="100"
            android:title="@string/terms_and_conditions"
            app:showAsAction="never"/>  <----------- use compatible namespace
    
        <item android:id="@+id/action_search"
              android:title="@string/search"
              android:orderInCategory="100"  <---------- use different value
              app:showAsAction="ifRoom|collapseActionView"
              app:actionViewClass="android.support.v7.widget.SearchView"/>
    
    </menu>
    

    3。如果没有底层处理(Activity 类不是子类),则从 onCreateOptionsMenu 返回 true

    UPDATE2: 明白了!您可能从 Activity 类扩展而来。应该是ActioBarActivity:

    public class MainActivity extends ActionBarActivity {
    ...
    

    【讨论】:

    • 是这样的,但还是报同样的错误。 MenuItem searchMenuItem = menu.findItem(R.id.action_search); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchMenuItem); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    • 我不知道我什么时候弄错了,但它仍然没有工作。你能告诉我如何写整个部分吗?这个问题困扰了我很久。请!!!
    • @WeRubChan 如果有帮助,请查看更新。我无法从您提供的代码片段中重现该问题
    • ActionBarActivity 已被弃用。
    【解决方案5】:

    您是否在构建中启用了 Proguard?如果是这样,您可能需要确保 appcompat 库位于 Proguard 排除列表中(在 proguard.cfg 中)。蛮力方法是保留所有支持库类:

       -keep class android.support.v4.app.** { *; }
       -keep interface android.support.v4.app.** { *; }
       -keep class android.support.v7.app.** { *; }
       -keep interface android.support.v7.app.** { *; }
    

    在我的例子中,我有一个扩展支持库的 SearchView 的类,所以我将它添加到我的 proguard.cfg:

    -keep public class * extends android.support.v7.widget.SearchView {
       public <init>(android.content.Context);
       public <init>(android.content.Context, android.util.AttributeSet);
    }
    

    为了避免错误,特别提到了构造函数:

    java.lang.NoSuchMethodException: <init> [class android.content.Context]
    

    【讨论】:

    • 这对我不起作用,但 -keep class android.support.v7.widget.SearchView { *; } 会。
    • SearchView是在android.support.v7.widget而不是android.support.v7.app包下,所以最好使用-keep class android.support.v7.** { *; }
    【解决方案6】:

    proguard-rules.pro 的最低要求

    -keep class android.support.v7.widget.SearchView {
       public <init>(android.content.Context);
       public <init>(android.content.Context, android.util.AttributeSet);
    }
    

    【讨论】:

    • 这个解决方案今天仍然适用。从com.android.tools.build:gradle:2.2.0 更新到com.android.tools.build:gradle:2.2.2 时再次看到这个错误弹出,这个最小的proguard 规则修复了它。
    【解决方案7】:

    我(也)得到了

    Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.ao)' on a null object reference
    

    在启动我的发布版本时(启用 proguard/minify)。

    将此添加到 proguard 规则修复它:

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

    这将保留 SearchView 小部件,但仍允许 proguard 丢弃您不使用的任何其他支持库类,因此您可以保持发布版本的整洁。

    【讨论】:

      【解决方案8】:

      我必须添加这个,现在它运行顺利:

      -keep class android.support.v7.widget.SearchView {
         public <init>(android.content.Context);
         public <init>(android.content.Context, android.util.AttributeSet);
      }
      -keep interface android.support.v7.widget.SearchView {
         public <init>(android.content.Context);
         public <init>(android.content.Context, android.util.AttributeSet);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多