Android 菜单ActionView在设置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

我想在工具栏菜单中设置自定义搜索布局。我的问题是,当我将expand listener设置为搜索项时,操作视图不再扩展。
我试着打电话

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;
}