2017-06-16 67 views
3

我開發一個Android應用程序,現在一切都很好,但是當試圖實現一步與谷歌的指導方針物料搜索查看和接下來的步驟一些教程,我不能figureout這個錯誤:材質搜索查看執行錯誤

menu_main.xml

<?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_ad" 
     android:enabled="true" 
     android:icon="@android:drawable/ic_menu_search" 
     android:title="Buscar" 
     android:visible="true" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="ifRoom|collapseActionView" /> 

    <item 
     android:id="@+id/publish_ad" 
     android:enabled="true" 
     android:icon="@android:drawable/ic_menu_send" 
     android:title="Publicar anuncio" 
     android:visible="true" 
     app:showAsAction="never" /> 

    <item 
     android:id="@+id/favs" 
     android:enabled="true" 
     android:title="Configuración" 
     android:visible="true" 
     app:showAsAction="never" /> 
</menu> 

MainActivity

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_main, menu); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.search_ad).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchView.setIconifiedByDefault(false); 

    return true; 
} 

錯誤:

06-16 15:36:51.021 1239-1239/com.bachecubano.elbache E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.bachecubano.elbache, PID: 1239 
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference 
     at com.bachecubano.elbache.MainActivity.onCreateOptionsMenu(Unknown Source) 
     at android.app.Activity.onCreatePanelMenu(Activity.java:2889) 
     at android.support.v4.b.m.onCreatePanelMenu(Unknown Source) 
     at android.support.v7.view.i.onCreatePanelMenu(Unknown Source) 
     at android.support.v7.app.h$b.onCreatePanelMenu(Unknown Source) 
     at android.support.v7.view.i.onCreatePanelMenu(Unknown Source) 
     at android.support.v7.app.q.j(Unknown Source) 
     at android.support.v7.app.q$1.run(Unknown Source) 
     at android.os.Handler.handleCallback(Handler.java:815) 
     at android.os.Handler.dispatchMessage(Handler.java:104) 
     at android.os.Looper.loop(Looper.java:207) 
     at android.app.ActivityThread.main(ActivityThread.java:5692) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 
+0

Ehi,我希望你解決了你的問題。如果是,請接受一個答案。它將幫助未來的開發者;)。 – JJ86

回答

2

你有下面的代碼添加在你的清單:

<activity 
    android:name=".ActivityWhereYouWantYourSearch"> 
    ... 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 

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

這對你RES/XML文件夾(命名爲searchable.xml):

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

我也會把請檢查您的onCreateOptionsMenu,如下所示:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_main, menu); 

    MenuItem searchItem = menu.findItem(R.id.search_ad); 
    if (searchItem != null) { 
     SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) searchItem.getActionView(); 
     // Assumes current activity is the searchable activity 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default 
    } 
    return true; 
} 

BTW,I d不要使用android:enabledandroid:visible,但是由您決定。

2

我不熟悉這種SearchView,但從錯誤我會猜測它無法獲得活動的ComponentName。我現在要嘗試的是在getComponentName() - > this.getComponentName()之前放置一個this,以確定它應該在哪裏獲得ComponentName。

只是一個猜測,所以請不要,如果這是錯誤的^^

+0

nope,沒有區別。 –

+0

Hm ... onCreateOptionsMenu()的代碼中有一些可爲空的東西,但代碼看起來不錯,我不認爲這段代碼有什麼問題。我現在唯一想到的就是你可能沒有任何東西可以在你的活動中搜索到。你想要搜索什麼? – CodeRed

+0

奇怪的問題是:當我在Android-Studio Shift + F9的調試方法中使用它時,一切都很順利,問題出現在我生成簽名的APK時。 –

2

你必須從onCreateOptionsMenu爲了返回true通脹發生恨我。因此,在返回語句之前嘗試訪問menu時,您會得到一個NPE

因此刪除這些代碼四行適當的方法onPrepareOptionsMenu

+0

沒有什麼,同樣的錯誤,我在GitHub上尋找一個好的庫來做到這一點。 –

2

我猜你的代碼的問題是,你使用的是最新版本的支持庫,但是使用舊風格訪問「搜索查看」這就是爲什麼它返回null。使用此行代碼通過 「MenuItemCompat」 來訪問你的搜索查看:

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

檢查這個博客瞭解更多詳情:

https://chris.banes.me/2014/10/17/appcompat-v21/

2

而不是

return true; 

加入這行

return super.onCreateOptionsMenu(menu);