1. 程式人生 > >Android 標題欄(二)

Android 標題欄(二)

       在前一篇文章Android標題欄(一)中我們已經講解了一些屬性,接下來我們繼續講解剩下的屬性。

ActionBar & Toolbar

設定ActionView

       我們可以在選單中設定ActionView,比如搜尋,他是一個帶圖示和輸入框的控制元件,他分別有兩種不同的形態,展開和摺疊。接下來我們就講講怎麼設定ActionView。
       1.在menu選單的item中設定actionViewClass屬性:

<item
    android:id="@+id/search_icon"
    android:icon="@drawable/actionbar_search_dark_icon"
android:title="@string/search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView"> </item> // 注意 根據是否引用的support包,actionViewClass設定的類不同,如果是support包則設定為android.support.v7.widget.SearchView且用app來標識, 否則設定為android.widget.SearchView且用android來標識

       2:在程式碼中可以獲取到ActionView,也可以設定ActionView:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_menu, menu);
    MenuItem search = menu.findItem(R.id.search_icon);
    // 這種方式也可以獲取到ActionView
    // SearchView view = (SearchView) search.getActionView();
// 一定要注意匯入的類是否正確,要區分support和非support包中的類 SearchView view = (SearchView) MenuItemCompat.getActionView(search); view.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); return true; }

       如果menu選單中沒有設定actionViewClass,也可以在程式碼中手動設定,search.setActionView(new SearchView(this));,上面就是獲取到的SearchView,一定要注意引入的類是否正確,否則會崩潰,拿到後就可以設定查詢等監聽了,這裡就不在演示了。

ActionView展開摺疊

       我們可以對選單新增展開摺疊監聽,比如搜尋框

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_menu, menu);
    MenuItem search = menu.findItem(R.id.search_icon);
    // support 包呼叫如下方法
    MenuItemCompat.setOnActionExpandListener(search, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return false;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            return false;
        }
    });
//        
//        search.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
//            @Override
//            public boolean onMenuItemActionExpand(MenuItem item) {
//                // TODO
//                return true;
//            }
//
//            @Override
//            public boolean onMenuItemActionCollapse(MenuItem item) {
//                // TODO
//                return true;
//            }
//        });
    return true;
}

       返回true表示應該被展開或者摺疊,返回false表示不應該被展開或者摺疊,處理邏輯都在兩個回撥中。

新增ActionProvider

       1.在menu選單中新增app:actionProviderClass屬性:

<item
    android:id="@+id/plus"
    android:icon="@drawable/actionbar_plus_icon_normal"
    android:title="@string/more"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
    app:showAsAction="always">
</item>

// 注意 根據是否引用的support包,actionProviderClass設定的類不同,如果是support包則設定為android.support.v7.widget.ShareActionProvider且用app來標識, 否則設定為android.widget.ShareActionProvider且用android來標識

       2. 在程式碼中設定

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_menu, menu);
    MenuItem plus = menu.findItem(R.id.plus);
    //support包中採用如下方法
    //MenuItemCompat.setActionProvider(plus, new ShareActionProvider(this));
    //非support中直接設定
    //plus.setActionProvider(new ShareActionProvider(this));

    //support包中採用如下方法
    ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(plus);
    provider.setShareIntent(getShareIntent());
    //ShareActionProvider provider = plus.getActionProvider();
    return true;
}

private Intent getShareIntent() {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    return intent;
}

       上述就實現了分享的效果,只是需要注意的是要區分所引用的類是否是support包中的類。型別一定要正確。

自定義provider

       如果系統提供的provider不符合要求怎麼辦?我們還可以自定義provider。

public class PlusProvider extends ActionProvider {
    /**
     * Creates a new instance. ActionProvider classes should always implement a
     * constructor that takes a single Context parameter for inflating from menu XML.
     *
     * @param context Context for accessing resources.
     */
    public PlusProvider(Context context) {
        super(context);
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        subMenu.add("tab1").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return false;
            }
        });
        subMenu.add("tab2").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return false;
            }
        });
    }

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public boolean hasSubMenu() {
        return true;
    }
}

       上面我們自定義了一個加號的provider,hasSubMenu表示十分有子選單,true表示有,在onPrepareSubMenu中初始化子選單。子選單可以設定顯示文字,圖示與響應點選事件。

       設定完成後,就與系統提供的provider使用方式一樣。

設定ActionLayout

       設定ActionLayout可以用自定義的佈局來展示選單圖示。
       1.建立一個佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="right"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.netease.study.ui.title.ActionBarActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/actionbar_setting_icon"/>

</RelativeLayout>

       佈局中包含了一個設定圖示,之後在menu中引用

<item
    android:id="@+id/plus"
    android:icon="@drawable/actionbar_plus_icon_normal"
    android:title="@string/more"
    app:actionLayout="@layout/action_layout"
    app:showAsAction="always">
</item>

       這樣就把預設的加號圖示給改變成設定圖示,在程式碼中也可以呼叫setActionView來更改圖示。但是不建議這樣做,每一個選單都做明確的事情。

頁面導航

       怎麼開啟頁面導航?在程式碼中呼叫getActionBar(). setDisplayHomeAsUpEnabled(true)就可以開啟頁面導航,如果是support包中需要呼叫getSupportActionBar(),開啟後,預設頁面左上角會出現返回箭頭。指示頁面點選可以返回。僅僅是開啟頁面導航是不夠的,還需要對他進行處理。

       因為返回箭頭也屬於ActionBar中的ActionView因此處理方式是一樣的,不同是的它的id已經預設指定為android.R.id.home。因此需要在onOptionsItemSelected函式中處理id為android.R.id.home:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            break;
    }
    return super.onOptionsItemSelected(item);
}

       左上的箭頭圖示,我們可以在style中設定為自己的圖示,也可以在程式碼中呼叫getActionBar().setHomeAsUpIndicator()來更改圖示。

       一般情況下只需要關閉掉當前介面,因此直接呼叫finish關閉掉當前頁面。但是這不是返回箭頭設定的初衷,否則他與軟體的返回沒有任何的區別,那在什麼情況下需要特殊處理吶?

       我們先來看看一個官方的圖片:

這裡寫圖片描述

       這裡有一個郵件列表頁面,點選其中一項,開啟郵件詳情,在郵件詳情頁可以左右導航到上一封或者下一封郵件,這樣在點選左上箭頭事希望能回到列表頁,而軟鍵盤返回則返回上一個頁面。這種情況怎麼處理?

       1.首先需要在AndroidManifest頁面中對Activity設定parent屬性:

// 4.1版本之前
<activity
    android:name=".ActionBarActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity">
    </meta-data>
</activity>

// 4.1版本之後
<activity
    android:name=".ActionBarActivity"
    android:parentActivityName=".MainActivity">
</activity>

       2:在程式碼中處理對應的邏輯:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent intent = NavUtils.getParentActivityIntent(this);
            if(intent!=null){
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                NavUtils.navigateUpTo(this, intent);
            }else{
                finish();
            }
            break;
    }
    return super.onOptionsItemSelected(item);
}

       這樣就可以直接放回到列表頁,不在返回上一個介面,與返回鍵處理是不同的。

設定ActionMode

       ActionMode是一種選單,但是與其他選單不一樣的是,他佔據的位置預設為ActionBar的位置,使用方式如下:

private void findViews() {
    View actionMode = findViewById(R.id.show_menu);
    assert actionMode != null;
    actionMode.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            ActionBarActivity.this.startActionMode(callback);
            return true;
        }
    });
}
private ActionMode.Callback callback = new ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.getMenuInflater().inflate(R.menu.action_menu1, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }
};

       我在對一個view進行長按的時候,出現ActionMode選單。

       長按前:
這裡寫圖片描述

       長按後:
這裡寫圖片描述

Toolbar

       如果Toolbar不當做ActionBar處理,Toolbar怎麼進行設定與選單顯示?


private void setToolbar(Toolbar toolbar) {
    //setSupportActionBar(toolbar);
    toolbar.setTitle("主標題");
    toolbar.setSubtitle("副標題");
    toolbar.setLogo(R.drawable.logo);
    toolbar.inflateMenu(R.menu.action_menu);
    toolbar.setOnMenuItemClickListener(new toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            return false;
        }
    });
}

       上面演示了當不做為ActionBar時,Toolbar怎麼進行設定,主要是選單的載入方式變化。Toolbar還可以與CollapsingToolbarLayout,AppBarLayout實現不一樣的標題效果。

總結

       這裡主要是對ActionBar和Toolbar的使用進行了梳理,其實還有怎麼對他們進行主題配置,這裡就不在展開了。

相關推薦

Android 標題

       在前一篇文章Android標題欄(一)中我們已經講解了一些屬性,接下來我們繼續講解剩下的屬性。 ActionBar & Toolbar 設定ActionView        我們可以在選單中設定ActionView,比如搜尋

Android 標題1

本文來自網易雲社群作者:孫有軍標題欄在每個應用中都有,有各種各樣的標題欄,今天我們就主要來說說標題欄怎麼做,主要內容涉及到自定義標題,ActionBar,Toolbar等知識。自定義標題幾年前開發安卓是沒有統一的標題的,每一個頁面都需要自己來佈局標題,如果有多個頁面標題類似,

android介面設計側邊的兩種實現方式

dome:https://github.com/linliangliang/sidebar 一、使用sideingMenu結合fragment實現。 二、使用NavigationView和DrawerLayout實現。 第一種實現方式:https://mp.csdn.net/posted

Android 之修改標題title

1、首先匯入ActionBarActivity包,然後將MainActivity繼承Activity而不是ActionBarActivity(注意這裡只改變的了主介面的標題) import android.support.v7.app.ActionBarActivity;

android事件分發

sim tdi p s oat front rac ram addclass framework 非常早之前寫過一篇android事件分發的博客,主要寫的是它是怎樣分發的,具體非常多原理的東西都沒有涉及到。今天就從源代碼看android怎樣控制它的分發機

Android之Intent

Android Intent 前一篇(Android之Intent(一))講解過A(它用來調起B界面,這裏先理解為父界面) 可以向B(這裏先理解為子界面), 本篇正好是一個逆反的過程 , 即B向A傳遞數據。 一 : 界面設計① ,A(activity_main.xml)重要控件:1‘ (TextVie

Android NDK學習:編譯腳本語法Android.mk和Application.mk

GC make files 文件的 包括 一次 opengl aries 基本語法 一、Android.mk Android.mk分為一下幾部分: LOCAL_PATH:= $(call my-dir), 返回當前文件在系統中的路徑,Android.mk文件開始時必須定義

Android Camera2 拍照——使用TextureView

wid metadata TE 遍歷 接口 post eating connected edit 原文:Android Camera2 拍照(二)——使用TextureView

Android 開發:安卓常用5大布局方式

一、Android中常用的5大布局方式有以下幾種: 1.線性佈局(LinearLayout):按照垂直或者水平方向佈局的元件; 2.幀佈局(FrameLayout) :元件從螢幕左上方(0,0)佈局元件; 3.相對佈局 (RelativeLayout) :相對其它元件的佈

Android輸入系統IMS的啟動過程和輸入事件的處理

本文首發於 劉望舒的部落格 地址:liuwangshu.cn/framework/i… 關聯絡列 解析WMS系列 深入理解JNI系列 輸入系統系列 前言 在上一篇文章中,我們學習了IMS的誕生(建立),IMS建立後還會進行啟動,這篇文章我們來學習IMS的啟動過程和輸入事件的處理。 1.IMS

android之animationanimationset、interpolator

一: animationset: 他是一個animation的一個子類,實際上是animation的一個集合。他將animation放到一個list集合中。需要對animation的基本設定可以通過animationset來設定。如果需要對一個控制元件進行多種動畫設定,可以採用animat

Android學習心得

Android儲存方式 儲存偏好設定 持久化資料:使應用程式執行時需要長期儲存一些資料。 SharePreferences物件、檔案和 SQLite資料庫來儲存這些持久化資料 存取活動的偏好設定 SharePreferences類屬於Android.cntent

android 之動畫 插值器

插值器 首先要了解為什麼需要插值器,因為在補間動畫中,我們一般只定義關鍵幀(首幀或尾幀),然後由系統自動生成中間幀,生成中間幀的這個過程可以成為“插值”。插值器定義了動畫變化的速率,提供不同的函式定義變化值相對於時間的變化規則,可以定義各種各樣的非線性變化函式,比如加速、減速等。下面是幾種常

Android進階: 應用程序啟動過程

1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 今天就將 應用程序啟動過程 總結一下(基於Android 8.0 系統)。 文章中例項&nbs

每日一記—獲取Bing每一日一圖實現Android歡迎頁

日期2018.9.12 第二部分:獲取bing每日一圖 通過訪問   http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=5&mkt=zh-CN  可以得到一組json資料,如下:

egret 釋出android原生專案執行專案

一、編譯Demo專案 在終端定位到Demo目錄,執行如下命令 egret build -e  (-e 編譯指定專案的同時編譯引擎目錄) 在瀏覽器訪問http://10.0.0.237/demo/index.html(10.0.0.237為本地ip地址) 二、Androi

Android學習筆記

1.Android的APK瘦身方法 在這裡給大家推薦一個網站,關於圖片線上壓縮的TinyPNG,然後使用android studio自帶工具Lint剔除無用資源(res資原始檔),如果你閒的話那就再手

Android開發筆記顏色的使用

顏色的編碼 Android中顏色值的定義是由透明度alpha和RGB(紅綠藍)三原色來定義的,有八位十六進位制數與六位十六進位制數兩種編碼,例如八位FFE

床頭筆記之Android開發學習

安卓Android開發環境搭建 之前用Android studio環境搭建,發現因為初學不熟,後面裝的東西太多了,電腦本身就卡,被我直接全卸了,打算用另一種簡單用得比較多的環境先入手。 本次用Eclipse、JDK、Android SDK、ADT外掛、安卓模擬器

android記錄筆記針對應用框架層梳理的整合筆記

這篇筆記主要是結合自我認知,加上各種學習資源,整理而成的查詢筆記,整理的不好,還望指出錯誤,主要是用於查詢與記錄,該篇筆記大多借鑑劉望舒的部落格,對大佬致敬哈,我也是你忠實的粉絲,如有冒犯,請見諒,我將立即刪除本篇文章。 針對應用框架層我認為必須要清楚的知識概念: 第一: