2014-09-12 39 views
0

我已經開始亂用碎片,因爲我在平板電腦上的應用可能會更有效地使用空間。FragmentActivity中的SearchView(支持)始終爲空

現在,在我的舊應用程序中,我在操作欄菜單中有一個SearchView,它會顯示在ifRoom上。我使用相同的代碼,但現在SearchView項目始終爲空。我不想根據活動片段或其他方式更改菜單項,我只需要使用SearchView在FragmentActivity中運行。

FragmentActivity:

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    getMenuInflater().inflate(R.menu.main, menu); 

    MenuItem searchItem = menu.findItem(R.id.svPet); 
    this.svPet = (SearchView)MenuItemCompat.getActionView(searchItem); 
    if(this.svPet != null) 
    { 
     this.svPet.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 
     this.svPet.setOnQueryTextListener(this); 
    } 

    return true; 
} 

的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/svPet" 
      app:actionViewClass="android.support.v7.widget.SearchView" 
      app:showAsAction="ifRoom" 
      android:title="@string/search" 
      android:titleCondensed="@string/search"> 
     </item> 

     ...Some more items that are never shown as action and work correctly 
</menu> 

所以,當正在創建菜單,this.svPet保持爲空,則搜索查看未在欄中顯示(即使有足夠的空間),當我點擊菜單項時,我的應用程序崩潰,說有一個空指針

this.svPet.setIconified(false); 

in

@Override 
public boolean onOptionsItemSelected(MenuItem item) 

關於什麼可能是錯誤的任何想法?我可能忽略了一些東西,但目前我看不出什麼問題。感謝提前:)

+0

你有xml可搜索配置嗎? – pskink 2014-09-12 18:58:32

+0

我不明白爲什麼我會需要它,因爲它以前一直沒有它,一直都很漂亮。使用FragmentActivity時它是強制性的嗎? – Tregan 2014-09-13 09:38:51

+0

不,它不是強制性的,但我認爲一些破損的可搜索文件可能導致空SearchView,順便說一句「searchItem」有效? – pskink 2014-09-13 09:50:57

回答

0

一些想法

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
MenuInflater inflater = getMenuInflater(); 
inflater.inflate(R.menu.menu, menu); 
MenuItem searchItem = menu.findItem(R.id.action_search); 
//SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
SearchView searchView = (SearchView) searchItem.getActionView(); 
if (searchView != null) { 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String s) { 
      // do something with s, the entered string 
      query = s; 
      Toast.makeText(getApplicationContext(), "String entered is " + s,Toast.LENGTH_SHORT).show(); 
      return true; 
     } 
     @Override 
     public boolean onQueryTextChange(String s) { 
      return false; 
     } 
    }); 
} 
return super.onCreateOptionsMenu(menu); 
} 

menu.xml文件

<item android:id="@+id/action_search" 
    android:orderInCategory="5" 
    android:title="Search" 
    android:icon="@drawable/ic_action_search" 
    android:showAsAction="ifRoom|collapseActionView" 
    android:actionViewClass="android.widget.SearchView" /> 
</menu> 
+0

我需要使用支持庫壽,所以不會代碼幾乎相同,exce [t爲添加queryTextListener? – Tregan 2014-09-13 09:37:06

0

所以......一些挖後,我發現,在FragmentActivity,getActionView(searchItem)組合使用時MenuItemCompat返回null。我認爲這是支持庫中的一個錯誤,所以我必須提交一個bugreport。 (完成,https://code.google.com/p/android/issues/detail?id=76141&thanks=76141&ts=1410649918

我的解決辦法:不要的

this.svPet = (SearchView)MenuItemCompat.getActionView(searchItem); 

我用

this.svPet = new SearchView(this); 
MenuItemCompat.setShowAsAction(searchItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); 
MenuItemCompat.setActionView(searchItem, this.svPet); 

- 編輯 - 後一些更多的環顧四周,我發現,你可以只使用ActionBarActivity而不是FragmentActivity,因爲ActionBarActivity擴展了FragmentActivity。使用時,可以使用

this.svPet = (SearchView)MenuItemCompat.getActionView(searchItem); 

照常。