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

时间:2013-03-15 00:07:08

标签: android android-actionbar searchview

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

enter image description here 请注意,还有其他菜单项,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" />
  

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>

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

4 个答案:

答案 0 :(得分:9)

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

简历中我所做的:

  1. SearchView customView的{​​{1}}内添加了自定义“添加项目”按钮ActionBar
  2. collapseActionView
  3. 中的搜索项中删除了android:actionLayoutmenu.xml
  4. 以编程方式折叠/展开SearchView
  5. 一些代码可以更好地理解我的所作所为。也许这对某人有用。

      

    menu.xml文件

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

    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>
    
      

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

答案 1 :(得分:2)

您只能使用yourmenu.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"
/>
<item
    android:id="@+id/your_other_menu_id"
    android:showAsAction="always"
    android:icon="@android:drawable/your_other_menu_ic"
 />

答案 2 :(得分:1)

只需你可以这样做

@Override
public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.main, menu);
     MenuItem searchItem = menu.findItem(R.id.action_search);
     searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
     searchView.setIconified(true); //to be opened collapsed
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){

        case R.id.action_search:
            searchView.setIconified(false);// to Expand the SearchView when clicked
            return true;
    }    
    return false;
}

在menu.xml中搜索项目

<强> showAsAction = “总是”

注意:我使用的是android.support.v7.widget.SearchView,但在你的情况下没关系

答案 3 :(得分:0)

只需更改菜单xml。 showaction前缀到您的应用名称

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

<item
    android:id="@+id/menu_search"
    android:actionLayout="@layout/actionbar_search"
    android:icon="@drawable/action_search"
    app:showAsAction="always|collapseActionView"
    android:title="@string/search"
/>

</menu>