其他分享
首页 > 其他分享> > android – 如何在点击“搜索”菜单时更改操作栏背景?

android – 如何在点击“搜索”菜单时更改操作栏背景?

作者:互联网

我已经浏览了Android开发者网站上的搜索界面教程并成功实施了.

我唯一无法实现的是点击搜索菜单更改操作栏背景并单击“返回”按钮将其还原?

以下是Gmail应用的截图.正常的操作栏看起来像这样.

当您单击“搜索”菜单时,它会更改为如下所示,而不会更改活动.

我想实现这个功能.请帮忙.谢谢.

解决方法:

基本上,FrameLayout是在Gmail应用程序中创建的,其中包含两个视图:

>工具栏 – 第一个红色工具栏,可在公共API中使用
> MaterialSearchActionView包含三个视图

> ImageView – 带后退箭头
> EditText
> ImageView – 带“x”/“麦克风”

第二个视图在公共API中不可用.

我认为这个想法很简单.当您打开“活动”时,第二个视图为GONE,当您按“搜索”图标时,将显示该视图.无法获取MaterialSearchActionView,因此您必须创建包含这些控件的自己的View.

我创建一个小例子如何做到这一点:

DoubleActionBarActivity.class:

public class DoubleActionBarActivity extends ActionBarActivity {

    Toolbar toolbar;
    Toolbar searchToolbar;
    boolean isSearch;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_with_double_toolbar);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        searchToolbar = (Toolbar) findViewById(R.id.toolbar_search);
        prepareActionBar(toolbar);
    }

    private void prepareActionBar(Toolbar toolbar) {
        setSupportActionBar(toolbar);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        if (Build.VERSION.SDK_INT >= 21) {
            getWindow().setStatusBarColor(getResources().getColor(isSearch ? android.R.color.darker_gray : android.R.color.holo_red_dark));
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(isSearch ? R.menu.search_for_second_toolbar : R.menu.search_item_only, menu);
        if (isSearch) {
            final SearchView search = (SearchView) menu.findItem(R.id.action_search).getActionView();

            search.setIconified(false);
            search.setQueryHint("search");
            search.setOnCloseListener(new SearchView.OnCloseListener() {
                @Override
                public boolean onClose() {
                    return true;
                }
            });
        }
        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case R.id.action_search:{
                isSearch = true;
                searchToolbar.setVisibility(View.VISIBLE);
                prepareActionBar(searchToolbar);
                supportInvalidateOptionsMenu();
                return true;
            }
            case android.R.id.home:
                if(isSearch){
                    isSearch = false;
                    prepareActionBar(toolbar);
                    searchToolbar.setVisibility(View.GONE);
                    supportInvalidateOptionsMenu();
                }
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

activity_with_double_toolbar.xml

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

    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/abc_action_bar_default_height_material">
        <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:background="@android:color/holo_red_dark"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

        </android.support.v7.widget.Toolbar>
        <android.support.v7.widget.Toolbar
                android:visibility="gone"
                android:background="@android:color/darker_gray"
                android:gravity="center_vertical"
                android:id="@+id/toolbar_search"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
        </android.support.v7.widget.Toolbar>
    </FrameLayout>

</LinearLayout>

search_for_second_toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
            app:showAsAction="ifRoom"
            app:actionViewClass="android.support.v7.widget.SearchView"
            android:title="Search"/>
</menu>

search_item_only.xml

<?xml version="1.0" encoding="utf-8"?>
<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:title="search"
          android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
          app:showAsAction="ifRoom" ></item>
</menu>

此外,您可以查看此库

https://github.com/Quinny898/PersistentSearch

这对你来说很有意思.

标签:android,android-actionbar,searchview
来源: https://codeday.me/bug/20190830/1765148.html