【发布时间】:2014-12-14 12:21:20
【问题描述】:
背景
我有一个 searchView 正在使用我创建的特殊类进行初始化,该类用于所有活动和片段。
问题
最近,可能是由于支持库的更新(或者因为我到目前为止没有使用它,我不记得了),我无法捕捉到 searchView 的展开/折叠事件。
正如我所发现的,即使我将 setSupportActionBar 与 Toolbar 实例一起使用,也会发生这种情况。
我尝试过的
我尝试过使用以下每种方法,但都没有奏效:
- MenuItemCompat.setOnActionExpandListener.
- MenuItemCompat.setOnActionExpandListener 以及图标化 SearchView,如某些网站所建议的那样。
- setOnActionExpandListener 在搜索菜单项本身上,但随后由于在扩展 ActionBarActivity 时无法使用而崩溃。
- SearchView.setOnCloseListener ,但这只有在我关闭它并且仅使用 UI 时才有效(调用 collapseActionView 时不会被调用)。
- 我还试图弄乱搜索菜单项的 XML 文件。
代码
这是我创建的辅助类:
SearchHolderCompat
public class SearchHolderCompat {
public MenuItem mSearchMenuItem;
public SearchView mSearchView;
private final Activity _context;
public SearchHolderCompat(final Activity context) {
_context = context;
}
public boolean isCurrentyExpanded() {
return mSearchMenuItem != null && MenuItemCompat.isActionViewExpanded(mSearchMenuItem);
}
public boolean hasQuery() {
return mSearchMenuItem != null && mSearchView != null && MenuItemCompat.isActionViewExpanded(mSearchMenuItem)
&& !TextUtils.isEmpty(mSearchView.getQuery());
}
public void addSearchItemAndInit(final Menu menu, final OnQueryTextListener onQueryTextListener,
final OnActionExpandListener onActionExpandListener) {
final MenuInflater menuInflater = _context.getMenuInflater();
menuInflater.inflate(R.menu.search_menu_item, menu);
init(menu.findItem(R.id.menuItem_search), onQueryTextListener, onActionExpandListener);
}
public void init(final MenuItem searchMenuItem, final OnQueryTextListener onQueryTextListener,
final OnActionExpandListener onActionExpandListener) {
this.mSearchMenuItem = searchMenuItem;
mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
if (mSearchView == null) {
MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
| MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
MenuItemCompat.setActionView(searchMenuItem, mSearchView = new SearchView(_context));
}
mSearchView.setQueryHint(_context.getString(R.string.search));
mSearchView.setOnQueryTextListener(onQueryTextListener);
MenuItemCompat.setOnActionExpandListener(searchMenuItem, onActionExpandListener);
}
}
MainActivity.java
public class MainActivity extends ActionBarActivity {
SearchHolderCompat mSearchHolder = new SearchHolderCompat(this);
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
mSearchHolder.addSearchItemAndInit(menu, new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(final String arg0) {
android.util.Log.d("AppLog", "onQueryTextSubmit");
return false;
}
@Override
public boolean onQueryTextChange(final String queryText) {
android.util.Log.d("AppLog", "onQueryTextChange");
return true;
}
}, new OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(final MenuItem arg0) {
android.util.Log.d("AppLog", "onMenuItemActionExpand");
return false;
}
@Override
public boolean onMenuItemActionCollapse(final MenuItem arg0) {
android.util.Log.d("AppLog", "onMenuItemActionCollapse");
return false;
}
});
return true;
}
}
search_menu_item.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<!-- search items -->
<item
android:id="@+id/menuItem_search"
android:icon="@drawable/ic_action_search"
android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"
tools:ignore="AlwaysShowAction"/>
</menu>
问题
处理 SearchView 和搜索菜单项的正确方法是什么(使用支持库)?
为什么“MenuItemCompat.setOnActionExpandListener”不起作用?
【问题讨论】:
-
你的设备 api 级别是多少?
-
您的
MenuItem item也是 android.support.v4.internal.view.SupportMenuItem 的一个实例吗?见:androidxref.com/5.0.0_r2/xref/frameworks/support/v4/java/… -
@pskink SupportMenuItem 是一个接口。你不能创建它的新实例...关于设备 API 级别,它使用支持库 v7,所以它应该从 API7 工作。但是,该应用的 minSdk 为 14 (ICS)。我想知道所有版本的解决方案。支持库的官方解决方案。原因是 ActionBarActivity 提供的不仅仅是支持蜂窝之前的设备。
-
@pskink 我没有创建它。它是负责执行此操作的框架。我只是使用 "menu.findItem" 传递它。即使你自己添加,你也得到了Android框架的MenuItem。
-
@pskink 这是菜单项的类:“android.support.v7.internal.view.menu.MenuItemImpl”。
标签: android android-actionbar android-support-library searchview