toolbar的使用姿勢
Toolbar作爲替代ActionBar的控件,Toolbar沒有ActionBar所讓人詬病的使用不方便
初步使用
Toolbar的使用非常簡單。只要在我的佈局文件中把Toolbar控件加入:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
然後在Activity文件中和處理普通控件一樣通過findViewById()
方法找到該控件,並通過Activity的setSupportActionBar(Toolbar)
方法進行設置即可。在這裏我爲toolbar設置了一個導航圖標:(我使用的v7包下的Toolbar,因此Activity需要是FragmentActivity的子類)
mToolbar= (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mToolbar.setNavigationIcon(R.drawable.nav);
執行!出現瞭如下的錯誤:
造成該問題的原因在於我當前的Activity上已經有了一個ActionBar,因此不能再添加一個Toolbar。解決該問題有s三種種方式:
修改style文件中的AppTheme的內容,使得ActionBar不能使用:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!--<item name="windowActionBar">false</item>--> <!--<item name="windowNoTitle">true</item>--> </style>
修改manifest文件中的Activity的主題,選擇一個不帶ActionBar的系統主題
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.AppCompat.Light.NoActionBar"> ... </application>
第三種方法實在上和第二種方式類似,但自定義空間大,同樣是修改style文件。在style文件中直接新建一個style,然該style直接繼承系統不帶ActionBar的style,然後在manifest文件中使用該主題
<style name="AppTheme.NoTitleBar" parent="Theme.AppCompat.DayNight.NoActionBar"></style> <!-------menifest-------> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme.NoTitleBar"> </application>
## 添加功能
根據Android的官方文檔中提到的的內容:
按照官方文檔上所說的的,Toolbar中可以添加5類功能
- 一個導航圖標
- 一個App的logo圖標
- 一個標題和副標題
- 一個或多個自定義控件
菜單
上圖是把Toolbar中能夠添加的控件全部添加後的界面。(搞一下知乎,嘻嘻)
實現上面效果的代碼如下:
佈局文件:在Toolbar中能夠直接添加控件。(Toolbar畢竟是繼承ViewGroup的控件)
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:text="你好" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageView android:layout_marginLeft="20dp" android:src="@drawable/clock" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </android.support.v7.widget.Toolbar>
菜單文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/setting" android:title="setting" app:showAsAction="never"/> </menu>
android推薦在使用showAsAction屬性時使用 app的的屬性而不是使用android屬性
Activity中的代碼
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setNavigationIcon(R.drawable.nav); mToolbar.setLogo(R.drawable.zhihu); mToolbar.setTitle("知乎"); mToolbar.setSubtitle("仿冒一下"); setSupportActionBar(mToolbar); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.menu, menu); return true; }
在這中間有幾點需要注意:
setSupportActionBar()方法的調用地方
如果setSupportActionBar() 調用的位置太靠前,會使得Toolbar的部分設置沒有效果,例如把setSupportActionBar()方法在setTitle方法前調用,Toolbar的title將顯示我們的項目名,而不是我所填寫的知乎。最好是在Toolbar的所有設置都已經完成後調用setSupportActionBar()方法。
menu的使用
在Toolbar中有一個inflateMenu()的方法,通過該方法可以設置Toolbar上面的OptionsMenu,但是當調用了setSupportActionBar()方法後該設置將無效,因此還是在Activity的onCreateOptionsMenu()方法中設置OptionsMenu。