2014-09-12 87 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); 

照常。