Android 菜单ActionView在设置expand listener后停止扩展
我想在工具栏菜单中设置自定义搜索布局。我的问题是,当我将expand listener设置为搜索项时,操作视图不再扩展。Android 菜单ActionView在设置expand listener后停止扩展,android,menu,android-menu,Android,Menu,Android Menu,我想在工具栏菜单中设置自定义搜索布局。我的问题是,当我将expand listener设置为搜索项时,操作视图不再扩展。 我试着打电话 item.expandActionView(); MenuItemCompat.expandActionView(item); 在OnOptions ItemSelected中,但它不起作用。 我的代码: 菜单\u projects.xml <menu xmlns:android="http://schemas.android.com/apk/res/a
我试着打电话
item.expandActionView();
MenuItemCompat.expandActionView(item);
在OnOptions ItemSelected中,但它不起作用。我的代码:
菜单\u projects.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:actionLayout="@layout/search_layout"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/search"
app:showAsAction="always|collapseActionView"/>
</menu>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/searchEditText"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_toLeftOf="@+id/closeSearchImageView"
android:layout_toStartOf="@+id/closeSearchImageView"
android:background="@null"
android:hint="@string/search"
android:imeOptions="flagNoExtractUi"
android:inputType="textCapSentences"
android:paddingLeft="10dp"
android:paddingRight="5dp"
android:singleLine="true"
android:textColor="@android:color/white"
android:textColorHint="#7dffffff"
android:textCursorDrawable="@drawable/cursor"/>
<ImageView
android:id="@+id/closeSearchImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:padding="3dp"
android:src="@drawable/abc_ic_clear_mtrl_alpha"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@+id/searchEditText"
android:background="#7dffffff"/>
</RelativeLayout>
有什么想法吗?我找到了解决办法。首先,在设置listener之后,我将ActionView设置为MenuItem programmaticaly。之后,我将侦听器方法的返回值从false改为true。也许对某人会有帮助。
完整代码:
@Override
public void onPrepareOptionsMenu(Menu menu) {
searchController = new SearchViewExpandCollapse(menu);
if (!query.isEmpty()) {
searchController.expandActionView();
searchController.setQuery(query);
}
super.onPrepareOptionsMenu(menu);
}
private class SearchViewExpandCollapse implements MenuItemCompat.OnActionExpandListener, OnClickListener
{
private final EditText editText;
private final MenuItem searchItem;
private Menu menu;
private View searchView;
public SearchViewExpandCollapse(Menu menu) {
this.menu = menu;
searchItem = menu.findItem(R.id.action_search);
MenuItemCompat.setOnActionExpandListener(searchItem, this);
searchItem.setActionView(R.layout.search_layout);
searchView = searchItem.getActionView();
editText = (EditText) searchView.findViewById(R.id.searchEditText);
editText.addTextChangedListener(textWatcher);
searchView.findViewById(R.id.closeSearchImageView).setOnClickListener(this);
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
menu.setGroupVisible(R.id.main_group, false);
editText.requestFocus();
editText.post(new Runnable()
{
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getApp().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
menu.setGroupVisible(R.id.main_group, true);
editText.clearFocus();
InputMethodManager inputManager = (InputMethodManager) getApp().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
return true;
}
private TextWatcher textWatcher = new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
query = s.toString();
searchAdapter.getFilter().filter(query);
}
};
public void expandActionView() {
searchItem.expandActionView();
}
public void setQuery(String query) {
editText.removeTextChangedListener(textWatcher);
editText.setText(query);
editText.setSelection(query.length());
editText.addTextChangedListener(textWatcher);
}
public void onClick(View v) {
if (editText.getText().length() != 0) {
editText.setText("");
} else {
searchItem.collapseActionView();
}
}
}
如果其他人后来发现这一问题(像我一样),问题就在这里:
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return false;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return false;
}
通过返回false,可以覆盖菜单项的原始操作。这应该是:
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
//what you want to do
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
//what you want to do
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
//what you want to do
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
//what you want to do
return true;
}