Android ActionBar:带有操作按钮的可折叠SearchView

Raf*_*łka 20 android android-actionbar searchview

在展开ActionBar搜索视图时,如何使用可折叠搜索视图构建单个操作项可见?为了更具描述性,这就是我需要的:

在此输入图像描述 请注意,还有其他菜单项,并android:uiOptions="splitActionBarWhenNarrow"在其中定义AndroidManifest.xml.

我尝试设置自定义搜索项目布局:

menu.xml文件

<item
    android:id="@+id/menu_search"
    android:actionLayout="@layout/actionbar_search"
    android:icon="@drawable/action_search"
    android:showAsAction="always|collapseActionView"
    android:title="@string/search" />
Run Code Online (Sandbox Code Playgroud)

actionbar_search.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="right"
    android:orientation="horizontal" >

    <com.actionbarsherlock.widget.SearchView
        android:id="@+id/search_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:iconifiedByDefault="false"
        android:queryHint="@string/search_hint" />

    <ImageButton
        android:id="@+id/add_item"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        style="@style/Widget.Sherlock.ActionButton"
        android:src="@drawable/content_new"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

但默认情况下,搜索视图会占用所有可用宽度,而按钮则不可见.我不知道如何强制SearchView填充应用程序图标和菜单项之间的所有可用空间.我发现的只是android:maxWidth属性,但这只允许硬编码维度,我正在寻找一些更灵活的解决方案.我也试着RelativeLayoutandroid:layout_toRightOf="@id/search_view"没有运气.

Raf*_*łka 9

在考虑了评论中的建议后,许多谷歌搜索和测试成功地获得了预期的效果.我并不为这个解决方案感到骄傲,但它有效,它不是太复杂,应该足够这个案例.

在简历中我做了什么:

  1. 放置SearchView在自定义的"添加项目"按钮customViewActionBar.
  2. 已删除collapseActionViewandroid:actionLayout从中搜索项目menu.xml
  3. SearchView编程方式折叠/扩展.

一些代码可以更好地理解我的所作所为.也许这对某人有用.

menu.xml文件

<item
    android:id="@+id/menu_search"
    android:icon="@drawable/action_search"
    android:showAsAction="always"
    android:title="@string/search" />

// ... other menu items
Run Code Online (Sandbox Code Playgroud)

actionbar_search.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="right"
    android:orientation="horizontal">

    <com.actionbarsherlock.widget.SearchView
        android:id="@+id/search_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:iconifiedByDefault="false"
        android:queryHint="@string/search_hint"
        android:visibility="invisible" />

    <ImageButton
        android:id="@+id/add_item"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        style="@style/Widget.Sherlock.ActionButton"
        android:src="@drawable/content_new"
        android:title="@string/add_item" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    actionBar.setCustomView(R.layout.actionbar_search);
    actionBarCustomView = ab.getCustomView();
    searchView = ((SearchView) actionBarCustomView.findViewById(R.id.search_view));
    searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            searchView.setVisibility(View.INVISIBLE);
            return false;
        }
    });
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // ...
        case R.id.menu_search:
            if (searchView.getVisibility() == View.VISIBLE) {
                searchView.setIconified(true);
                searchView.setVisibility(View.INVISIBLE);
            } else {
                searchView.setMaxWidth(abCustomView.getWidth() - addButton.getWidth());
                searchView.setVisibility(View.VISIBLE);
                searchView.setIconified(false);
            }
            break;
        // ...
    }
    return true;
}

@Override
public void onBackPressed() {

    if (searchView.getVisibility() == View.VISIBLE) {
        searchView.setIconified(true);
        searchView.setVisibility(View.INVISIBLE);
        return;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)