android 4.4~5.0狀態(tài)欄搞定之后 toolbar怎么辦~學渣帶你扣基礎(chǔ)(原創(chuàng))

上一節(jié)http://www.itdecent.cn/p/bf40b1c1d2cf 分析狀態(tài)欄之后,我們要開始加上toolbar
先給布局的xml
<pre>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="8dp"
app:contentInsetLeft="@dimen/second_keyline_default"
app:contentInsetStart="@dimen/second_keyline_default"
app:popupTheme="?attr/actionBarPopupTheme"
app:theme="?attr/actionBarTheme">

    <Spinner
        android:id="@+id/stack"
        style="@style/PopupTheme"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dp"
        android:layout_marginStart="4dp"
        android:overlapAnchor="true" />

</android.support.v7.widget.Toolbar>

</pre>

在我們activity中 我們要怎么去處理呢?

第一步 還是先考慮版本

<pre>
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setTitleTextAppearance(context, R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);
這是設(shè)置了字體
if(Utils.hasKitKat() && !Utils.hasLollipop()) {
((LinearLayout.LayoutParams) mToolbar.getLayoutParams()).setMargins(0, getStatusBarHeight(this), 0, 0);
mToolbar.setPadding(0, getStatusBarHeight(this), 0, 0);
在4.4之上5.0以下的時候 我們設(shè)置的mToolbar 的值。
}
</pre>

為什么?

4.4是狀態(tài)欄透明處理。然后去填充。所以我們要設(shè)置值
5.0 為什么不用去管? 因為我們是直接設(shè)置的顏色

<pre>
int color = Utils.getStatusBarColor(SettingsActivity.getPrimaryColor(this));
if(Utils.hasLollipop()){
getWindow().setStatusBarColor(color);
}
else if(Utils.hasKitKat()){
SystemBarTintManager systemBarTintManager = new SystemBarTintManager(this);
systemBarTintManager.setTintColor(color);
systemBarTintManager.setStatusBarTintEnabled(true);
}
</pre>

上面是設(shè)置狀態(tài)欄的顏色

在最后別忘記
setSupportActionBar(mToolbar);
int color = SettingsActivity.getPrimaryColor(this);
Drawable colorDrawable = new ColorDrawable(color);
getSupportActionBar().setBackgroundDrawable(colorDrawable);
這是給toolbar設(shè)置顏色。

這樣就能保持一個顏色的統(tǒng)一。到這里基本上就介紹完了

下面開始了解toolbar的功能方面

菜單的顯示 一共有兩個方法

1onCreateOptionsMenu

此方法用于初始化菜單,其中menu參數(shù)就是即將要顯示的Menu實例。
返回true則顯示該menu,false 則不顯示; (只會在第一次初始化菜單時調(diào)用)

2onPrepareOptionsMenu

在onCreateOptionsMenu執(zhí)行后,菜單被顯示前調(diào)用;如果菜單已經(jīng)被創(chuàng)建,則在菜單顯示前被調(diào)用。
同樣的, 返回true則顯示該menu,false 則不顯示;
(可以通過此方法動態(tài)的改變菜單的狀態(tài),比如加載不同的菜單等)

不重要的方法
3.public void onOptionsMenuClosed(Menu menu)
每次菜單被關(guān)閉時調(diào)用.
(菜單被關(guān)閉有三種情形,menu按鈕被再次點擊、back按鈕被點擊或者用戶選擇了某一個菜單項)

點擊事件的方法

4onOptionsItemSelected

<pre>
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch(item.getItemId())//得到被點擊的item的itemId
{
case R.id.menu_setting://這里的Id就是布局文件中定義的Id,在用R.id.XXX的方法獲取出來
break;
case R.id.menu_info:
break;
}
return true;
}
</pre>

添加菜單

<pre>
2.1代碼添加:
menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)
add()方法的四個參數(shù),依次是:

  1、組別,如果不分組的話就寫Menu.NONE, 

  2、Id,這個很重要,Android根據(jù)這個Id來確定不同的菜單 

  3、順序,哪個菜單項在前面由這個參數(shù)的大小決定 

  4、文本,菜單項的顯示文本

   add()方法返回的是MenuItem對象,調(diào)用其setIcon()方法,為相應(yīng)MenuItem設(shè)置Icon

 示例:
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add(Menu.NONE, Menu.First+1, 0, "設(shè)置").setIcon(R.drawable.setting);
    return true;
}

</pre>

除了這個之外 還需要了解一個方法
supportInvalidateOptionsMenu

通知系統(tǒng)刷新菜單,系統(tǒng)會回調(diào)onPrepareOptionsMenu 方法,在這里面根據(jù)自己的邏輯,進行菜單的處理。這是網(wǎng)上的解釋。 但是 我去實驗。onCreateOptionsMenu
onPrepareOptionsMenu都會去從新調(diào)用! 并且原來的語句本來就有邏輯問題。大家想一下。除了第一次點擊菜單調(diào)用onCreateOptionsMenu。以后每次都會調(diào)用onPrepareOptionsMenu。這樣supportInvalidateOptionsMenu方法只是刷新的作用? 讓我們來看看 源碼

Paste_Image.png
Paste_Image.png

看到了把 這個方法調(diào)用之后 onCreateOptionsMenu
onPrepareOptionsMenu 都會從新調(diào)用。

下面開始寫我們這個布局

<pre>

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.activity, menu);

</pre>
<pre>
<?xml version="1.0" encoding="utf-8"?>

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

<item
    android:id="@+id/menu_create_file"
    android:icon="@drawable/ic_menu_new_file"
    support:showAsAction="always"
    android:title="@string/menu_create_file"
    android:visible="false"/>
<item
    android:id="@+id/menu_create_dir"
    android:icon="@drawable/ic_menu_new_folder"
    support:showAsAction="always"
    android:title="@string/menu_create_dir"
    android:visible="false"/>
<item
    android:id="@+id/menu_search"
    support:actionViewClass="android.support.v7.widget.SearchView"
    android:icon="@drawable/abc_ic_search_api_material"
    support:showAsAction="ifRoom|collapseActionView"
    android:title="@string/menu_search"
    android:visible="false"/>
<item
    android:id="@+id/menu_list"
    android:icon="@drawable/ic_menu_view_list"
    support:showAsAction="ifRoom"
    android:title="@string/menu_list"
    android:visible="false"/>
<item
    android:id="@+id/menu_grid"
    android:icon="@drawable/ic_menu_view_grid"
    support:showAsAction="ifRoom"
    android:title="@string/menu_grid"
    android:visible="false"/>
<item
    android:id="@+id/menu_sort"
    android:icon="@drawable/ic_menu_sortby"
    support:showAsAction="ifRoom"
    android:title="@string/menu_sort"
    android:visible="false">
    <menu>
        <item
            android:id="@+id/menu_sort_name"
            android:title="@string/sort_name"/>
        <item
            android:id="@+id/menu_sort_date"
            android:title="@string/sort_date"/>
        <item
            android:id="@+id/menu_sort_size"
            android:title="@string/sort_size"/>
    </menu>
</item>
<item
    android:id="@+id/menu_settings"
    android:icon="@drawable/ic_menu_settings"
    support:showAsAction="never"
    android:title="@string/menu_settings"/>
<item
    android:id="@+id/menu_about"
    android:icon="@drawable/ic_dialog_info"
    support:showAsAction="never"
    android:title="About"/>

<item
    android:id="@+id/menu_exit"
    support:showAsAction="never"
    android:title="Exit"/>

</menu>

android:visible="false" 這個作用是不顯示
</pre>
效果圖

Paste_Image.png

超過三個選項之后 都是變成下拉

另外 我啰嗦一句supportInvalidateOptionsMenu作用。

大家 考慮過這么一種畫面 在一個activity中。 你有一個側(cè)滑菜單。 當你點擊一個選項的時候 你bar菜單是變化的。 哈哈。 相信大家想到了吧。 這個方法 最大的作用是在這里。 當然還有很多作用。 比如有數(shù)據(jù)更新的時候 也是要調(diào)用這個的。 好了 下面繼續(xù)。

附送一個完整的 方法
<pre>
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.activity, menu);

    final MenuItem searchMenu = menu.findItem(R.id.menu_search);

//文本框輸入事件
mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenu);
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
//輸入完成后,點擊回車或是完成鍵
public boolean onQueryTextSubmit(String query) {
mSearchExpanded = mSearchResultShown = true;
mState.currentSearch = query;
mSearchView.clearFocus();
onCurrentDirectoryChanged(ANIM_NONE);
Bundle params = new Bundle();
params.putString("query", query);
AnalyticsManager.logEvent("search", getCurrentRoot(), params);

//添加下面一句,防止數(shù)據(jù)兩次加載
searchView.setIconified(true);
return true;
}
//查詢文本框有變化時事件
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});

    MenuItemCompat.setOnActionExpandListener(searchMenu, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            mSearchExpanded = true;
            updateActionBar();
            return true;
        }

//TODO 添加關(guān)閉事件
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
mSearchExpanded = mSearchResultShown = false;
if (mIgnoreNextCollapse) {
mIgnoreNextCollapse = false;
updateActionBar();
return true;
}

            mState.currentSearch = null;
            onCurrentDirectoryChanged(ANIM_NONE);
            return true;

重要的事情說三遍 三遍 三遍 這個響應(yīng)事件 你想成功 那么onMenuItemActionCollapse 返回值true
}
});
//TODO 添加關(guān)閉事件
mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
mSearchExpanded = mSearchResultShown = false;
if (mIgnoreNextClose) {
mIgnoreNextClose = false;
updateActionBar();
return false;
}

            mState.currentSearch = null;
            onCurrentDirectoryChanged(ANIM_NONE);
            return false;
        }
    });


    return true;
}

</pre>

searchView.setIconified(true); 作用。原來是search鍵,在按下和松開時,分別運行了,action_down和 action_up兩個方法,這兩方法又都運行了這個查詢事件,這怎么辦呢,我們知道,如果查詢框為空的話,它不會運行,所以我們在運行我們的代碼之后加上

invalidateMenu 好了 暫時到這里 我們明天繼續(xù)完善

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容