Android UI 之側滑抽屜選單(一)——DrawerLayout + NavigationView
本文出自:http://blog.csdn.net/dt235201314/article/details/78962509
一丶概述
Android側滑效果實現有很多種,這裡先說說,Android系統5.0後自帶的DrawerLayout + NavigationView。
二丶效果圖

1.gif
三丶看程式碼
DrawerLayout + NavigationViewxml佈局
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/blue_bg"> <com.example.jinboy.codertodeveloperbytcler.java_demo.appdemo.ui.view.CircleImageView android:id="@+id/iv_mine_avatar" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:layout_below="@+id/title_bar" android:layout_marginStart="10dp" android:src="@drawable/mine_me"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="CSDN 部落格" android:textColor="@android:color/black" android:textSize="20sp" android:textStyle="bold" /> </RelativeLayout> </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/navigationView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header" app:menu="@menu/activity_main_drawer" /> </android.support.v4.widget.DrawerLayout>
NavigationView裡的headerLayout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_evenings" android:orientation="vertical"> <com.example.jinboy.codertodeveloperbytcler.java_demo.appdemo.ui.view.CircleImageView android:id="@+id/iv_mine_avatar" android:layout_width="70dp" android:layout_height="70dp" android:layout_below="@+id/title_bar" android:layout_centerHorizontal="true" android:layout_marginStart="10dp" android:layout_marginTop="50dp" android:src="@drawable/mine_me"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:layout_marginEnd="10dp" android:layout_marginStart="10dp" android:layout_marginTop="20dp" android:text="我的部落格地址:\nhttp://blog.csdn.net/dt235201314" android:textColor="@color/white" android:textSize="15sp" android:textStyle="bold" /> </LinearLayout>
menu
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_csdn" android:icon="@mipmap/mine_about_icon" android:title="CSDN" /> <item android:id="@+id/nav_jianshu" android:icon="@mipmap/mine_about_icon" android:title="簡書" /> </group> </menu>
分別對應
屬性設定注意點:
1.android:layout_gravity="left"或者“star”表示從左邊彈出,這裡跟後面java程式碼關閉相關
drawerLayout.closeDrawer(GravityCompat.START);
2.app:itemIconTint="@color/blue" 設定選單選項圖片顏色,不寫預設為無色(灰色),如需要現實為圖片原本顏色java程式碼設定
navigationView.setItemIconTintList(null);
Activity java程式碼
public class MyCsdnActivity extends Activity implements NavigationView.OnNavigationItemSelectedListener { private DrawerLayout drawerLayout; private CircleImageView circleImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_csdn_activity); initView(); } private void initView() { drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); circleImageView = (CircleImageView) findViewById(R.id.iv_mine_avatar); NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView); navigationView.setNavigationItemSelectedListener(this); navigationView.setItemIconTintList(null); circleImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { drawerLayout.openDrawer(GravityCompat.START); } }); } /** * 選單點選響應函式 * * @param item 選單 * @return boolean */ @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { drawerLayout.closeDrawer(GravityCompat.START); switch (item.getItemId()) { case R.id.nav_csdn: WebViewActivity.startWebViewActivity(this,"http://my.csdn.net/dt235201314"); break; case R.id.nav_jianshu: WebViewActivity.startWebViewActivity(this,"http://www.jianshu.com/u/905c7de5ae83"); break; default: } return false; } /** * 重寫返回鍵響應函式 */ @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } }
3.NavigationView頭部佈局的id
NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView); View headerView = navigationView.getHeaderView(0); tv_name = (TextView) headerView.findViewById(R.id.tv_name); tv_originalArticleNumber = (TextView) headerView.findViewById(R.id.tv_originalArticleNumber); tv_visitNumber = (TextView) headerView.findViewById(R.id.tv_visitNumber);