zoukankan      html  css  js  c++  java
  • Android Widget:DrawerLayout配合Toolbar的使用及常见问题

    前言:最近在仿写网易云音乐安卓端界面,记录下所遇到的问题及解决方案


    DrawerLayout的基础使用

    DrawerLayout经常配合NavigationView及Toolbar使用,编写侧滑栏

    1.首先添加支持

    implementation 'com.android.support:design:28.0.0'
    

    2.编写布局

    • DrawerLayout是一种布局控件,类似LinearLayout,但最好作为根布局使用
    • DrawerLayout布局中默认有两个控件,第一个是主界面的布局/控件,第二个是侧滑栏中的布局(经常使用NavigationView)
    • 侧滑栏中的布局/控件必须设置layout_gravity属性。设置了layout_gravity="start/left"的视图才会被认为是侧滑菜单,表示侧滑菜单是在左边还是右边,如果不设置,在打开关闭侧滑栏的时候会出错
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayout
        android:id="@+id/dl_homePage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        
    	<!--第一个控件,侧滑栏不显示时的界面-->
    
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
    	    <android.support.v7.widget.Toolbar
    	        android:id="@+id/tb_title"
        	    android:fitsSystemWindows="true"
            	android:background="@color/colorNetease"
    	        android:layout_width="match_parent"
        	    android:layout_height="wrap_content">
    	    </android.support.v7.widget.Toolbar>
    
            <android.support.v4.view.ViewPager
                android:id="@+id/vp_main"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
            </android.support.v4.view.ViewPager>
    
        </LinearLayout>
    
    	<!--第二个控件,侧滑栏的界面-->
    
        <android.support.design.widget.NavigationView
            android:id="@+id/navigation"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:menu="@menu/moudule_menu_drawerlayout"
            app:headerLayout="@layout/module_headerlayout_navigation">
        </android.support.design.widget.NavigationView>
            
     </android.support.v4.widget.DrawerLayout>
    

    3.在逻辑中监听事件打开侧滑栏

    public class MainActivity extends AppCompatActivity {
    
        private Button btn_openDrawer;
        private DrawerLayout drawerLayout;
    
    	@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.module_activity_main);
            btn_openDrawer = findViewById(R.id.btn_openDrawer);
            btn_openDrawer.setOnClickListener((view)->drawerLayout.openDrawer(GravityCompat.START););
            //这里传入GravityCompat.START因为layout_gravity属性设置为start
    	}
    }
    
    基本方法
    boolean isDrawerOpen(@EdgeGravity int drawerGravity): 判断菜单是否打开
    
    openDrawer(@EdgeGravity int gravity) : 打开菜单
    
    closeDrawer(@EdgeGravity int gravity) : 关闭菜单
    
    以上三个方法传入参数:
    GravityCompat.START : 左边菜单
    GravityCompat.END : 右边菜单
    
    addDrawerListener(@NonNull DrawerListener listener) : 添加监听
    DrawerListener 类
    onDrawerSlide(View drawerView, float slideOffset): 滑动时调用
    onDrawerOpened(View drawerView): 打开菜单时调用
    onDrawerClosed(View drawerView): 关闭菜单时调用
    onDrawerStateChanged(@State int newState): 菜单状态改变时调用
    

    配合Toobar的使用

    用Toolbar代替ActionBar并设置home键用于调出DrawerLayout

    常见问题

    1.将侧滑栏高度延伸至状态栏

    step one:
    侧滑栏所在Activity中onCreate方法中加入以下代码使状态栏透明
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
               getWindow().setStatusBarColor(Color.TRANSPARENT);
           }
           getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    step two:
    对应xml文件DrawerLayout布局中
    设置属性
    android:fitsSystemWindows="true"
    
  • 相关阅读:
    Mysql基础(十二):sql语句执行步骤详解(一)准备工作
    JVM 专题二十三:面试题(一)
    leetcode算法题基础(三十八) 并查集(二)547. 朋友圈
    leetcode算法题基础(三十七) 并查集(一)200 岛屿数量
    leetcode算法题基础(三十六)动态规划(四)91. 解码方法
    leetcode算法题基础(三十五)动态规划(三)5. 最长回文子串
    leetcode算法题基础(三十四)动态规划(二)121. 买卖股票的最佳时机
    Virtio-vsock Device + aF_UNIX 套接字通信
    Using the Firecracker Virtio-vsock Device + F_UNIX 套接字通信
    vhost-user
  • 原文地址:https://www.cnblogs.com/kafm/p/12721840.html
Copyright © 2011-2022 走看看