AppCompatActivity


剛開始看HelloWorld的目錄結構
然后就發現Android Studio中的是

import android support.v7.app.AppcompatActivity; public class MainActivity extends AppCompatActivity{ ...... }

而不是繼承自Activity

在光標指向AppCompatActivity,Ctrl+o即可查看本類中所有的方法
Alt+F7可以查看方法的引用
F4可以查看類的繼承關系(Ctrl+H)


Android Support Library(安卓兼容包)是為了構件一個可以跑在不同版本Android平台的軟件。

重構AppCompat
在新的AppCompat中,加入主題色,Toolbar等功能。在新版本中推薦使用AppCompatActivity代替ActionBarActivity。

android:theme
新版本AppCompat允許了Toolbar使用android:theme代替app:theme,兼容API11+

 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_drawer_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:layout_below="@+id/main_statusBar" android:background="?attr/colorPrimary" android:translationZ="4dp" android:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

AppCompatDialog對話框

終於加入MD對話框和新主題theme Theme.AppCompat.Dialog使用

  AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Dialog"); builder.setMessage("少數派客戶端"); builder.setPositiveButton("OK", null); builder.setNegativeButton("Cancel", null); builder.show();

在API22之前我們使用標題欄基本都是在 ActionBarActivity的Activity 中處理的,而API22之后,谷歌遺棄了 ActionBarActivity,推薦我們也可以說是強制我們使用AppCompatActivity。
然而 ActionBarActivity 和AppCompatActivity 的使用大同小異。

詳解如下:

1.初探AppCompatActivity
按照androidStudio默認順序創建項目,默認Activity繼承自AppCompatActivity.代碼如下:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }

運行。下面我們來一步一步擴展其標題欄,讓它的內容更加豐富多彩。

  1. AppCompatActivity 與Toolbar結合

其實我們並不是要使用AppCompatActivity自帶的標題欄,那樣擴展會很麻煩,在14年的Android5.0的時候就用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar設置到Activity中。

a. 首先我們必須在配置文件中,寫入Toolbar,代碼如下:

<android.support.v7.widget.Toolbar android:id="@+id/activity_main_toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary"> </android.support.v7.widget.Toolbar>

解釋(1)android:minHeight = "?attr/actionBarSize":設置標題欄最小高度為ActionBar的高度。
解釋(2)android:background = "?attr/colorPrimary":該主題下的主色。也就是默認的灰色

我們知道在AndroidManifest.xml清單文件下application中設置了android:theme = "@style/AppTheme"而查看APPTheme看到如下樣式

<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> </style> </resources>

從名字我們就可以看出來,默認的標題欄為黑色。我們使用了Toolbar就必須修改樣式文件,將原來的標題欄去掉,修改后的樣式文件如下:

<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> </style> </resources>

如下這個時候運行,那么你將看到界面也是沒有標題欄的,因為你並沒有設置到AppCompatActivity中去。

b. 將Toolbar顯示到界面

我們創建一個方法名為initActionBar(),首先當然是獲取Toolbar控件,然后將Toolbar設置到Activity中去。代碼如下:

public void initActionBar() { Toolbar toolbar = (Toolbar) findViewById(R.id.activity_main_toolbar); setSupportActionBar(toolbar); }

現在我們運行,我們將得到如下界面:

依然不是你期待的效果,下面我們將介紹AppCompatActivity的細節。

  1. AppCompatActivity詳解

a. 設置title
我們可以看到,標題欄始終顯示我們的項目名,這樣顯然給用戶看是不理想的。那么怎么設置標題欄的字符串。我們可以在setSupportActionBar(toolbar)之前加入如下代碼:

setTitle("liyuanjinglyi");

此setTitle("liyuanjinglyj")是AppCompatActivity的方法,並不是Toolbar的方法,那么我們運行一下程序得到如下界面:

那么我們將剛才的AppCompatActivity的setTitle換成Toolbar的setTitle看看效果會怎么樣,其實結果如上圖一樣,沒有任何變化。

可能你希望title顯示在中間,很遺憾,toolbar與AppCompatActivity並沒有提供相關的方法,不過可以在toolbar中加入一個TextView,配置其屬性,讓其顯示在最中間。

b. 設置回退按鈕

假如我們這個界面並不是主界面,而是一個子界面,這個時候我有一個需求,需要回退到上一個界面,那么怎么設置左邊的圖標並實現其方法。其實很簡單,在setSupportActionBar(toolbar);后面加入如下代碼:

toolbar.setNavigationIcon(R.drawable.back);
toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } });

為什么在setSupportActionBar(toolbar);后面假如而不在前面,你可以加入到前面試試,雖然可以顯示回退的圖片,但是點擊並沒有調用該按鈕的點擊事件,而在setSupportActionBar(toolbar);后面設置點擊才有反應。一定要記住,不然回退是不會起作用的。

c. 設置logo

設置logo在標題欄並不少見,比如網易APP首頁,其實代碼很簡單,也僅僅需要一條代碼即可,在setSupportActionBar(toolbar)前加入如下代碼:

toolbar.setLogo(R.id.app_logo);

d.設置副標題
在setSupportActionBar(toolbar)前加入如下代碼:

toolbar.setSubtitile("liyuanjing");

運行界面后,如下:

e. 設置菜單

我們知道onCreateOptionMenu是上下文菜單,同理可以直接在該方法中設置菜單,代碼如下:

@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; }

此方法為Activity方法。因為你在上面已經將Toolbar設置到了Activity中,所以默認也會顯示到標題欄中,如果你覺得這樣不習慣,那么你可以添加一條語句,不過這條語句添加與否都沒關系。

toolbar.setOnCreateContextMenuListener(this);
  1. Toolbar的Style

標題下的Toolbar是藍色,且有很好的Style,那么這是怎么設置呢?雖然我們這里重點是剖析Activity但是遇到有關Activity標題欄樣式的還是要提到。

我們粗略的講解上面的標題欄用到了哪些Style:

a. <item name = "colorPrimary">#4876FF<item>:如第一步直接在Toolbar控件下面設置的屬性一樣,就是Toolbar的顏色

b. <item name="colorPrimaryDark">#3A5FCD</item>:狀態欄顏色也就是標題欄上面的那個顏色,而我用的是小米1S測試的,其固件並沒有很好的實現其功能。

c. <item name = "android:windowBackground">@android:color/white</item>:窗口背景色,也就是Activity標題欄下面所有地方的顏色。

完整代碼如下:

<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- toolbar(actionbar)顏色 --> <item name="colorPrimary">#4876FF</item> <!-- 狀態欄顏色 --> <item name="colorPrimaryDark">#3A5FCD</item> <!-- 窗口的背景顏色 --> <item name="android:windowBackground">@android:color/white</item> </style>
  1. Toolbar菜單樣式

我們來看看如果直接使用上面的點擊后邊的菜單會有什么效果:

需要完成的任務是將該菜單的樣式和其他App一樣,在標題欄下面彈出。

首先要說明一下,toolbar菜單默認樣式的父類為Widget.AppCompat.Light.PopupMenu.Overflow,那么要更改toobar中菜單的彈出的樣式,就必須繼承這個父類的樣式。

其代碼如下:

<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- toolbar(actionbar)顏色 --> <item name="colorPrimary">#4876FF</item> <!-- 狀態欄顏色 --> <item name="colorPrimaryDark">#3A5FCD</item> <!-- 窗口的背景顏色 --> <item name="android:windowBackground">@android:color/white</item> <item name="actionOverflowMenuStyle">@style/LYJMenuStyle</item> </style> <style name="LYJMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow"> <item name="overlapAnchor">false</item> </style>

設置這一個屬性那么其彈出的樣式就與其他APP一樣不會覆蓋標題欄。

還有其他屬性這里簡要說明一下:

①<item name="android:popupBackground">?attr/colorPrimary</item>:彈出菜單背景色為標題欄的背景色

②<item name="android:dropDownVerticalOffset">0dip</item>:彈出菜單與標題欄的垂直間距

將這兩條加入LYJMenuStyle中就可以了實現如下圖所示的彈出菜單:

最后介紹一下菜單里面重要的幾個屬性:

app:showAsAction有三個值:
always:總是顯示在界面上never:不顯示在界面上,只讓出現在右邊的三個點中ifRoom:如果有位置才顯示,不然就出現在右邊的三個點中

可以用 | 同時使用兩個上面的值。

系統也為菜單提供了默認的分享菜單與查詢菜單,代碼如下:

app:actionViewClass="android.support.v7.widget.SearchView"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"

從名字想必不需要過多解釋,最后一個就是顯示的優先級,也就是顯示的順序,誰在最前面,誰在后面:

android:orderInCategory數值越小,顯示靠前,且優先級最大。


Android Tips:Hello AppCompatActivity,Goodbye ActionBarActivity

Beautiful Dialogs

Previously, to open a dialog may have used the following code:

var builder = new AlertDialog.Builder (this);

builder.SetTitle ("Hello Dialog")
.SetMessage ("Is this material design?")
.SetPositiveButton ("Yes", delegate { Console.WriteLine("Yes"); })
.SetNegativeButton ("No", delegate { Console.WriteLine("No"); });

builder.Create().Show ();


參考文章

1.深入剖析Android四大組件(九)——Activity之AppCompatActivity與toolbar的結合
2.Android Support Library更新到v22.1之AppCompat新特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM