2014-09-04 56 views
8

我试图更新所有的库,但我仍然有错误。我能够在模拟器上运行应用程序,但是当我导出APK并在真实的Android设备上运行它时,该应用程序无法运行。Android SearchView不起作用

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 
+0

你用什么minsdk水平? – 2014-09-04 09:29:56

+0

MinSdkVersion是8 – 2014-09-04 15:45:18

回答

0

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

@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.检查搜索查看从android.support.v7.widget.SearchView;
2.检查菜单资源进口是正确的:从onCreateOptionsMenu

<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.返回true,如果没有底层处理(Activity类是不subclassed)

UPDATE2: GOT IT!您可能从Activity类延伸。应该ActioBarActivity

public class MainActivity extends ActionBarActivity { 
... 
+0

是这样,但它仍然有相同的错误。 '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()));' – 2014-09-04 16:14:00

+0

请看看http://developer.android.com/training/search/backward-compat.html#check-ver – 2014-09-04 16:17:38

+0

我不知道当我错了,但它仍然没有工作。你能告诉我如何写整个部分。这个问题困扰了我很长一段时间。请!!! – 2014-09-04 16:35:44

14

是否启用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.** { *; } 

就我而言,我有这样的扩展支持库的搜索查看,所以我说这我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] 
+3

重现这个问题,这不适合我,但 - 维护类android.support.v7.widget.SearchView {*; }的确如此。 – Ernest 2016-04-04 15:36:25

+0

SearchView是在android.support.v7.widget下不是android.support.v7.app包,所以最好使用-keep类android.support.v7。** {*; } – 2016-09-19 12:20:57

+0

相关问题:https://code.google.com/p/android/issues/detail?id=224967 – BoD 2016-11-07 17:43:43

5

推出我的发布版本时,我(也)有

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

(使用ProGuard /缩小启用) 。

添加这ProGuard的规则固定它:

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

这将保持搜索查看窗口小部件,但仍允许proguard的扔掉你没有使用任何其他支持库类,让你保持你的发布构建漂亮整齐。

27

添加以下代码proguard-rules.pro

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

太棒了!这对我来说是完美的 – ziniestro 2016-05-20 07:38:21

7

长时间的研究后,这个问题的一个简单的解决办法就是,只有在应用程序/ proguard的/ android.proguard文件添加

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

的AndroidStudio。

干杯!

5

所需最低至proguard-rules.pro

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

这个解决方案今天仍然有用。从'com.android.tools.build:gradle:2.2.0'更新为'com.android.tools.build:gradle:2.2.2'时,再次弹出此bug弹出窗口,并且这个最小化的proguard规则修复了它。 – Carmen 2016-11-07 17:34:59

1

我不得不添加这和现在的作品顺利:

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