Android ActionBar使用教程_Android

來源:互聯網
上載者:User

ActionBar的引入方式:

有幾種,從 Android 3.0(API lever 11) 開始,所有使用 Theme.Holo 主題(或者它的子類)的 Activity 都包含了 action bar,當 targetSdkVersion 或 minSdkVersion 屬性被設定成 “11” 或更大時,它是預設主題。為了相容Android3.0之前的低版本,actionbar通常通過extends整合Support包下的AppCompatActivity實現,同時需要使用Theme.AppCompat的ActionBar主題(想要去掉ActionBar使用Theme.AppCompat.NoActionBar主題或者Theme.Holo.NoActionBar主題即可)。
註:如果你想使用setSupportActionBar()方法的方式添加ActionBar,那麼同時你想使用ActionBar的主題,那麼就必須設定去除主題中的Actionbar,<item name="windowActionBar">false</item>,二者只能保留其一。否則會報錯:
java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
:就算設定<item name="windowActionBar">false</item>,只要使用的是ActionBar的主題,ActionBar依然存在,原因暫時不知

V4包和V7包
V4包是為Android 1.6(API Level  4)及以上的版本設計的,它包含大部分高版本中有而低版本中沒有的API,包括application components、user interface features、accessibility、data handling、network connectivity、and programming utilities,提供對Fragment、ViewPager等Android3.0之後的高版本特性的相容:
Fragment:通過它可以讓同一個程式適配不同的螢幕。
NotificationCompat:支援更豐富的通知形式;
LocalBroadcastManager: 用來在同一個應用內的不同組件間發送Broadcast。

V7包是Android 2.1(API Level 7)及以上的版本Google提供了一系列的support包
 這個庫添加 Action Bar 使用者介面設計模式的支援。這個庫包括支援material design的使用者介面實現。
注意:這個庫依賴於v4 Support Library。
這裡有一些包含在v7 appcompat庫中的關鍵類:
ActionBar:提供ActionBar使用者介面模式的實現
AppCompatActivity :增加一個Activity類,可以用作支援ActionBar實現的Activity的基類。
AppCompatDialog :添加一個對話方塊類,可以作為一個appcompat主題對話方塊基類。
ShareActionProvider :增加一個標準化的共用動作(如電子郵件或發送到社交網站),包含在ActionBar中。

為了在3.0之前的版本中使用Fragment我們要繼承Support v4包下的FragmentActivity,如果想在3.0之前的版本使用ActionBar就需要繼承Support V7包下的ActionBarActivity,使用Theme.Holo系列主題,ActionBarActivity是繼承自FragmentActivity的。Android5.0之後V7封裝更新,使用ActionBar可以繼承V7包中的AppCompatActivity,同時提供了一系列新的ActionBar的主題(Theme.AppCompat )
1.添加左側返回按鈕:
在資訊清單檔 中為Activity添加上級Activity:android:parentActivityName=".activity.ImageShowActivity"
同時調用ActionBar的setDisplayHomeAsUpEnabled(true)方法設定左上方返回表徵圖,預設是左箭頭

getSupportActionBar().setDisplayHomeAsUpEnabled(true);  // 如果你的minSdkVersion屬性是11或更高, 應該這麼用:  // getActionBar().setDisplayHomeAsUpEnabled(true);

註:如果你的編譯版本compileSdkVersion 23高於Android5.0(API level 21),只用在Manifest檔案中聲明父級Activity即可。比21更低版本未測試。同時如果主動設定了getActionBar().setDisplayHomeAsUpEnabled(false);則一定會取消返回按鈕

註:回退Activity的一個技巧:Itent對象中包括FLAG_ACTIVITY_CLEAR_TOP標識。用這個標記,如果你要啟動的Activity在當前任務中已經存在,那麼,堆棧中這個Activity之上的所有的Activity都有被銷毀,並且把這個Activity顯示給使用者。
註:這種返回不會保留之前Activity中的資料,也不能使用onSaveInstance() 方法儲存
這時候需要進行特殊處理,在複寫的onOptionsItemSelected方法中,判斷當前Activity和目標父級Activity執行個體是否在同一個任務棧,在同一個任務棧就清空目標父級Activity執行個體之上的執行個體,並在同一個任務棧啟動目標父級執行個體。否則建立一個任務棧啟動。這麼處理的初衷是這裡的向上導航是與回退簡單finish掉執行個體相區別的,這裡希望跨越式的回到主Activity。

 @Override  public boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {      case android.R.id.home:        ToastUtils.show(this, "home");        Intent upIntent = NavUtils.getParentActivityIntent(this);        //判斷當前Activity在向上導航到目標Intent upIntent是否需要重建新的任務棧,        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {          //重建新的任務棧          TaskStackBuilder.create(this)              .addNextIntentWithParentStack(upIntent)              .startActivities();        } else {          //使用當前任務棧          upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//清空任務棧中目標Activity執行個體之上的所有執行個體          NavUtils.navigateUpTo(this, upIntent);//直接在同一個任務棧跳轉        }        return true;//消費掉事件    }    return super.onOptionsItemSelected(item);  }

自訂Home:
同時取消顯示左上方返回按鈕

 /*設定左上方Logo Icon*/    actionBar.setLogo(R.drawable.go_back_64px);//(單獨設定沒作用)    actionBar.setDisplayShowHomeEnabled(true);//是否顯示Logo,必須為他setLogo()才起作用    actionBar.setDisplayUseLogoEnabled(true);//是否使用Activity的Logo,即setLogo()方法設定的Logo     actionBar.setDisplayHomeAsUpEnabled(false);//是否顯示左上方預設的返回按鈕    actionBar.setHomeButtonEnabled(false);//按鈕是否可以點擊(實測無用,false下依然可以點擊--已經設定了該Activity的父級Activity)

設定標題的顏色:
根據測試直接在Activity的主題中或者ActionBar的主題中進行設定是不生效的。可以通過為Activity或者Actionbar主題設定titleTextStyle屬性,添加文字的主題風格,該風格需要繼承自@android:style/TextAppearance:

<!--設定標題的顏色,注意使用相容包下的屬性-->    <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>    <item name="titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item> <style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">    <item name="android:textColor">@color/blue</item>    <item name="android:textSize">16sp</item>  </style>

注意若是使用了Support中的ActionBar就需要使用屬性titleTextStyle而不是android:titleTextStyle,否則設定的顏色也不會生效。
設定Actionbar浮動:
做法是:在不要顯示ActionBar的時候使用hide()方法隱藏
重寫Activity的onTouchEvent()方法:

 @Override  public boolean onTouchEvent(MotionEvent event) {    Log.d("debug", "onTouchEvent");    if (actionBar == null) {      actionBar = getSupportActionBar();    }    switch (event.getAction()) {      case MotionEvent.ACTION_UP://        if (actionBar != null) {        if (actionBar.isShowing()) {          //隱藏          actionBar.hide();        } else {          //顯示          actionBar.show();        }//        }        break;    }    return super.onTouchEvent(event);  }

設定Actionbar隱藏時不重繪Activity的布局:
在 action bar 隱藏和顯示過程中調整布局的大小,很影響視覺體驗。
需要APi  level 19 及之上:設定內容填充系統狀態列,不存在重新布局的問題了

複製代碼 代碼如下:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

或者為Activity主題添加屬性:
<item name="android:windowTranslucentStatus">true</item>
官方文檔給出的方法是:設定疊加模式,不限版本

 <item name="android:windowActionBarOverlay">true</item>    <!-- 相容支援庫 -->    <item name="windowActionBarOverlay">true</item>

設定系統狀態列
在android4.4之前,在App的上方總是保留著黑乎乎的系統狀態列,在4.4之後引入了透明狀態列效果(Translucent System Bar),使App可以使用全部螢幕 ,同時使系統狀態列和導覽列半透明
在Activity的主題中

 <item name="android:windowTranslucentStatus">true</item>    <item name="android:windowTranslucentNavigation">true</item>//除此之外還可以設定系統狀態列的顏色:適用於頁面是單純顏色:<item name="android:windowTranslucentStatus">false</item>    <item name="android:windowTranslucentNavigation">true</item>    <item name="android:statusBarColor">@android:color/transparent</item>

此處參考:Translucent System Bar 的最佳實務 - 安卓 - 伯樂線上

設定Menu菜單不遮擋AcionBar:
使用Support V7包下的ActionBar,預設Menu菜單會頂到螢幕的頂部,遮擋到Actionbar,想要的效果是Menu位於ActionBar的下面。
在Activity的主題中添加屬性:actionOverflowMenuStyle

<!--設定menu菜單不遮擋actionbar-->    <item name="actionOverflowMenuStyle">@style/OverflowMenu</item>//建立這個主題,繼承自主題Widget.AppCompat.PopupMenu <style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow">    <!--相容Api 21之前的版本 -->    <item name="overlapAnchor">true</item>     <!-- Api 21-->    <!--<item name="android:overlapAnchor">false</item>-->  </style>

消除左側按鈕的遺留空白:
設定不顯示左上方返回按鈕之後,它左邊的空白仍然在顯示。

設定Menu菜單:
1、取消menu菜單:
在複寫的onCreateOptionsMenu方法返回false即可,或者不複寫該方法。
設定Menu功能表按鈕的顏色:
注意設定Activity的主題而不是Actionbar的主題:

 <!--設定menu的文字顏色-->    <!--<item name="actionMenuTextColor">@color/yellow</item>-->    <!--<item name="android:actionMenuTextColor">@color/yellow</item>-->    <!--上面兩個設定是無效的-->    <item name="android:itemTextAppearance">@style/myCustomMenuTextApearance</item> <style name="myCustomMenuTextApearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">    <!--文字顏色-->    <item name="android:textColor">@color/blue</item>    <!--文字大小-->    <item name="android:textSize">16sp</item>  </style>

2、設定Menu菜單的背景色:
也是在Activity的主題中進行設定

 <!--s設定Menu菜單的背景色-->    <item name="android:itemBackground">@color/black_light</item>

3、自訂Menu功能表項目:
除了使用系統給定的action,還可以自訂,這是需要使用action view and action provider,個人理解是可以提供視覺效果和互動功能的menu item。
同樣是在Menu中定義item,需要使用actionViewClass和actionLayout中的一個,其中actionViewClass 指定使用的控制項類名,如搜尋控制項SearchView,actionLayout指定自己定義的布局檔案作為action的視圖。
actionViewClass: The class of a widget that implements the action.
actionLayout: A layout resource describing the action's components.
1).使用actionViewClass添加一個系統搜尋item:
添加item:

<item android:id="@+id/action_search"   android:title="@string/action_search"   android:icon="@drawable/ic_search"   app:showAsAction="ifRoom|collapseActionView"   app:actionViewClass="android.support.v7.widget.SearchView" />

處理搜尋事件:通過menu的findItem()方法拿到控制項的引用,綁定文字查詢的監聽器

 @Override  public boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.menu_main, menu);    //找到ActionBar上所添加的UI組件的方法:    mSearchView = (SearchView) menu.findItem(R.id.searchItem).getActionView();    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {      @Override      public boolean onQueryTextSubmit(String string) {        Toast.makeText(ShowImageActivity.this, "查詢:" + string, Toast.LENGTH_SHORT).show();        return false;      }       @Override      public boolean onQueryTextChange(String string) {        return true;      }    });}

上面為item設定了app:showAsAction="ifRoom|collapseActionView"屬性,其中collapseActionView含義是沒有互動動作時(未點擊時)搜尋item收合只顯示icon,有互動時,item展開充滿actionbar剩餘空間。搭配ifRoom表示有空間時展示到App bar上,沒空間時作為menu item.never表示一直作為menu item。always表示一直展示在App bar上。

2).使用actionLayout添加一個自訂的搜尋控制項
添加item

<item    android:id="@+id/custom_search"    android:icon="@drawable/ic_action_search"    android:title="custom_search"    app:actionLayout="@layout/search_layout"    app:showAsAction="collapseActionView|always|withText" />

布局檔案:search_layout.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="200dp"  android:layout_height="wrap_content"  android:gravity="center_vertical"  android:orientation="horizontal"  android:padding="5dp">   <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:padding="5dp"    android:src="@drawable/ic_action_search" />   <EditText    android:layout_width="200dp"    android:layout_height="wrap_content"    android:layout_weight="1" /></LinearLayout>

同時如果設定了app:showAsAction="collapseActionView"這個屬性,還可以監聽shouqi/展開事件:在onCreateOptionsMenu(Menu menu)方法中 

MenuItem collapseActionView = menu.findItem(R.id.searchItem);    // Define the listener    MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {      @Override      public boolean onMenuItemActionCollapse(MenuItem item) {        // Do something when action item collapses        ToastUtils.show(ShowImageActivity.this, "action item collapses");        return true; // Return true to collapse action view       }       @Override      public boolean onMenuItemActionExpand(MenuItem item) {        // Do something when expanded        ToastUtils.show(ShowImageActivity.this, "action item expanded");        return true; // Return true to expand action view      }    };    MenuItemCompat.setOnActionExpandListener(collapseActionView, expandListener);

以上就是Android ActionBar使用教程,希望對大家學習Android軟體編程有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.