一:替換ToolBar
一.ToolBar基礎替換
- 先將主題中的ActionBar改爲Light.NoActionBar
- 修改main.xml文件
1)將ToolBar的高度設置爲原ActionBar
2)指定背景色
3)由於設置了淡色系主題,ToolBar上的元素會使用深色主題以區分主體,原本白色會變黑色,比較壓抑,所以指定單獨深色ToolBar,上面的字會繼承原Light白色
4)設置彈出的菜單項爲Light
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
/>
- 這裏我們發現左上角就是項目名稱,來到清單文件修改label即可
二.ToolBar結合引入菜單
- res文件夾下創建menu文件夾,創建toolbar.xml的menu resourse file
- menu中加入app的資源地址,方便兼容,其中item組
- showasAction
1)always: 永遠顯示在ToolBar中
2)ifRoom:空間夠在toolbar不夠在菜單中
3)never: 永遠顯示在菜單中
ps:toolbar中item只顯圖標,菜單中action只顯文字
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/backup"
android:icon="@mipmap/arrow_up"
android:title="BackUP"
app:showAsAction="always"/>
<item
android:id="@+id/delete"
android:icon="@mipmap/delete"
android:title="Delete"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/setting"
android:icon="@mipmap/setting"
android:title="Settings"
app:showAsAction="never"/>
</menu>
- 來着MainActivity中複寫創建菜單的方法和點擊方法即可
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.backup:
Toast.makeText(this,"BackUP",Toast.LENGTH_SHORT).show();
break;
case R.id.delete:
Toast.makeText(this,"Delete",Toast.LENGTH_SHORT).show();
break;
case R.id.setting:
Toast.makeText(this,"Setting",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
二.彈出側邊欄
1. DrawerLayout
- 藉助Google提供的DrawerLayout,實心滑動菜單
這個佈局可以放入兩個直接子控件,第一個是主屏幕中的內容,第二個是滑動菜單中顯示的內容
- 修改main.xml
第一個Fragment子控件 爲主界面,第二個text
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
</FrameLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:text="This Is Side"
android:textSize="30sp"
android:background="#FFF"/>
</androidx.drawerlayout.widget.DrawerLayout>
第二個子佈局Layout_gravity=“start” 必須要指定,start表示是按照系統的左右設置彈出菜單的,貌似也可以設置left等等,不設置只顯示第二個子項
二.加入導航按鈕
- oncreate方法中取得drawlay對象
- 拿到對應Actionbar實例(由ToolBar實現的)【getSupportAsUpEnabled(true)】
- 讓導航按鈕顯示出來【 actionBar.setDisplayHomeAsUpEnabled(true)】設置圖標【setHomeAsUpIndicator()】
- Toolba菜單項設置點擊,id永遠是是home,選中控制切換即可【 mDrawerLayout.openDrawer(GravityCompat.START)】
- 點開只有一個text有點醜。。。不過沒事 ,接下來用到的NavigationViw可以解決這個問題
三.NavigationView
一. 導包
- Design庫
implementation ‘com.android.support:design:24.2.1’- 圓形化圖片開源項目
implementation ‘de.hdodenhof:circleimageview:2.1.0’
二. 在寫之前還需要準備兩個東西
-
menu用來在NaviagtionView中顯示具體的菜單項
1)建立nav_menu後指定單選菜單項<group android:checkableBehavior="single">
2)接着是item項 -
headLayout用來在其中顯示頭部佈局的 ,新建一個RelativeLayout,限定高度,設置圓形圖片居中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="180dp"
android:padding="10dp"
android:background="?attr/colorPrimary">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/icon_image"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@mipmap/rolling"
android:layout_centerInParent="true" />
<TextView
android:id="@+id/mail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="[email protected]"
android:textColor="#FFF"
android:textSize="14sp" />
<TextView
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/mail"
android:text="風凌"
android:textColor="#FFF"
android:textSize="14sp" />
</RelativeLayout>
- 通過app方法添加兩個子佈局,大標題二中的text改爲NavigationView,app兼容引入即可
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/nav_menu"
app:headerLayout="@layout/nav_header"/>
四.懸浮可交互按鈕
一. FloatingActionButton
- Design Support庫中提供的一個控件,可以輕鬆的實現懸浮按鈕效果。
- 在DrawableLayout第一主佈局中ToolBar後加入該按鈕,自帶陰影效果,也可以自帶指定app:elevation=“8dp”
- MainActivity可以設置點擊監聽
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@mipmap/play"/>
- 設置點擊事件,和普通按鈕一樣,設置個click監聽就好了
二.Snackbar
- 在監聽事件中可以彈出小的個選框提示Snackbar
- 下面是示例代碼,有點套娃,點擊懸浮按鈕,彈出Snack信息:開始播放,點擊信息中的undo,顯示取消播放
- 但是這個時候我們發現原本的浮動按鈕被擋住了,emmm有點尷尬,這裏就可以使用CoordinatorLayout【類加強版FragmentLayout】
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "開始播放", Snackbar.LENGTH_SHORT)
.setAction("Undo", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "取消播放",
Toast.LENGTH_SHORT).show();
}
})
.show();
}
});
三.CoordinatorLayout
- CoordinatorLayout可監聽所有子控件【通過子控件傳入的View】的各種事件,然後幫助我們做最合理的響應,我們用這個替換Fragment,就行了
- 由於Drawable的第二個子佈局和CoordinatorLayout沒多大關係,所以佈局任然不會移動,相到移動方案再補充。