饭后Android 第一餐-导航视图NavigationView+抽屉布局DrawerLayout+工具栏Toolbar

饭后Android 第一餐-饭后Android 第一餐-导航视图NavigationView+抽屉布局DrawerLayout+工具栏Toolbar


本讲图标来源: Iconfont-阿里巴巴矢量图标库

1.NavigationView

侧滑栏(NavigationView)通常与抽屉布局(DrawerLayout)结合使用,实现了良好的侧滑交互体验。从常规开发来说,侧滑一般都是左侧实现侧滑,抽屉布局可有三个子布局。(注意:第一个子布局一定要是主界面,其次的两个子布局就是左右两侧的布局,左右两侧只放一个也可)

在本讲里,我将为大家介绍导航视图(NavigationView)结合抽屉布局(DrawerLayout)实现在页面中侧滑的效果,一般都是左侧实现侧滑, 抽屉布局可有三个子布局。(注意:第一个子布局一定要是主界面,其次的两个子布局就是左右两侧的布局,左右两侧只放一个也可),导航视图有一个头部文件和一个菜单menu

1.使用方法

1.导包

第一步,在bulid.gradle下导入依赖包

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

在这里插入图片描述
我们会发现依赖包那一行爆红了,原因是可能是库的版本较低,出现了不兼容的现象。
参考博客
解决方法:
Refactor—>Migrate to AndroidX
在这里插入图片描述
然后点击Migrate(迁移-相当于备份,也可以取消),然后点击左下角 Do Refactor(重构),就可以发现问题解决了
在这里插入图片描述

2.布局

1.头布局

第一步,创建一个新布局,作为侧滑栏的头部布局 headlayout
在这里插入图片描述
在这里插入图片描述
添加布局代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
   android:background="#07E1CF"
    android:layout_height="200dp">

    <ImageView
        android:id="@+id/head"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@drawable/head"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="Rose-J"
        android:textSize="21dp"
        android:textColor="#000000"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/head" />



</androidx.constraintlayout.widget.ConstraintLayout>

在这里插入图片描述

2.Menu

第一步,创建一个 menu 文件

在menu中,如果给group设置id属性就会有分割线,不设置的话不会有

在这里插入图片描述
第二步,加入代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group
        android:id="@+id/group1"
        android:checkableBehavior="single"
        >


        <item
            android:id="@+id/item_1"
            android:icon="@drawable/message"
            android:checkable="true"

            android:title="消息" >
        </item>
        <item
            android:id="@+id/item_2"
            android:icon="@drawable/friend"
            android:checkable="true"

            android:title="好友" >
        </item>
        <item
            android:id="@+id/item_3"
            android:icon="@drawable/about"
            android:checkable="true"

            android:title="关于" >
        </item>
    </group>

</menu>

在这里插入图片描述

3.NavigationView控件

在mainactivity的布局文件中加入NavigationView控件
(注意有许多控件的时候,NavigationView控件要生效,必须要放到最底下)

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/drawerLayout"
    tools:context=".MainActivity">


    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/headlayout"
        app:menu="@menu/menu"/>


</androidx.drawerlayout.widget.DrawerLayout>
  • headerLayout 头布局
  • layout_gravity 划出的方向
  • menu 菜单

在这里插入图片描述
为了美观,再把顶部标题框去掉
在这里插入图片描述
运行
在这里插入图片描述

2.菜单item监听

在这里插入图片描述



public class MainActivity extends AppCompatActivity {
    
    

    NavigationView mNavigationView;
    DrawerLayout mDrawerLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mNavigationView=findViewById(R.id.navigationView);
        mDrawerLayout=findViewById(R.id.drawerLayout);
        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    
    
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    
    //菜单 item 监听
                switch (menuItem.getItemId()) {
    
    
                    case R.id.item_1:

                        Log.i("Mainactivity","item_1");
                        break;
                    case R.id.item_2:
                        Log.i("Mainactivity","item_2");
                        break;
                    case R.id.item_3:
                        Log.i("Mainactivity","item_3");
                        break;
                }
                mDrawerLayout.closeDrawer(GravityCompat.START);
                return true;
            }
        });
    }
}

运行(return flase就不会出现item被选中状态)
在这里插入图片描述

2.Toolbar

Android5.0引入了一个新控件Toolbar,代替了ActionBar,由于其高度的灵活性、可定制性,符合Material Design的风格,越来越多的应用用上了Toolbar,我们可以看到知乎、网易云音乐的标题栏用的Toolbar。由于ActionBar是由系统创建并对其进行相关的初始化,并不能很好的控制,所以在很多APP上就出现了跟ActionBar相似的效果,但是又不是ActionBar,模仿ActionBar而已,我们原来的APP就是自己定义的一个简单的title布局,使用的时候加入到相应的页面,所以这个时候Toolbar出现了,ToolBar只是一个普通的控件,继承自ViewGroup,可以直接在布局文件中使用,但是跟ActionBar又没有太大的区别,只不过更自由了。

1.使用方法

1.主布局

方法一:通过布局文件来设置
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/drawerLayout"
    tools:context=".MainActivity">


   <com.google.android.material.appbar.AppBarLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:background="#ffffff"
       >

       <androidx.appcompat.widget.Toolbar
           android:id="@+id/toolbar"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:background="#0FF1DD"
           app:navigationIcon="@drawable/nav"
           app:logo="@drawable/head2"
           app:title="Rose-J"
           app:subtitle="你好"/>
   </com.google.android.material.appbar.AppBarLayout>





    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/headlayout"
        app:menu="@menu/menu"/>





</androidx.drawerlayout.widget.DrawerLayout>



方法二,在activity里面通过java代码设置

    //去掉原标题
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        //设置 左边 点击划出侧滑栏的图标
       mToolbar.setNavigationIcon(R.drawable.nav);
       //设置LOGO
       mToolbar.setLogo(R.drawable.head2);
       //设置主标题
       mToolbar.setTitle("Rose-J");
       //设置副标题
       mToolbar.setSubtitle("Hello");

(旁边的图标是后面加的)
在这里插入图片描述

2.Menu

新建菜单 menu_toolbar
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >


    <item
        android:id="@+id/share"
        android:icon="@drawable/share"
        android:title="分享"
        app:showAsAction="always|withText"/>
    <item
        android:id="@+id/check"
        android:icon="@drawable/check"
        android:title="扫一扫"
        app:showAsAction="always|withText"/>
    <item
        android:id="@+id/item_1"
        android:title="反馈"
        app:showAsAction="never|withText"/>
    <item
        android:id="@+id/item_2"
        android:title="更多"
        app:showAsAction="never|withText"/>
</menu>

在这里插入图片描述

2.菜单item点击

在这里插入图片描述


public class MainActivity extends AppCompatActivity {
    
    

    NavigationView mNavigationView;
    DrawerLayout mDrawerLayout;
    Toolbar mToolbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mNavigationView=findViewById(R.id.navigationView);
        mDrawerLayout=findViewById(R.id.drawerLayout);
        mToolbar=findViewById(R.id.toolbar);
         //使用ToolBar控件替代ActionBar控件
        setSupportActionBar(mToolbar);



        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    
    
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    
    //菜单 item 监听
                switch (menuItem.getItemId()) {
    
    
                    case R.id.item_1:

                        Log.i("Mainactivity","item_1");
                        break;
                    case R.id.item_2:
                        Log.i("Mainactivity","item_2");
                        break;
                    case R.id.item_3:
                        Log.i("Mainactivity","item_3");
                        break;
                }
                mDrawerLayout.closeDrawer(GravityCompat.START);// 点击item 侧滑栏收回
                return true;
            }
        });

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
    
        switch (item.getItemId()) {
    
    

            case R.id.share:
                Toast.makeText(this,"分享成功",Toast.LENGTH_SHORT).show();
                break;
            case R.id.check:
                Toast.makeText(this,"请对准二维码",Toast.LENGTH_SHORT).show();
                break;
            case R.id.item_1:
                Toast.makeText(this,"反馈成功",Toast.LENGTH_SHORT).show();
                break;
            case R.id.item_2:
                Toast.makeText(this,"加载中.....",Toast.LENGTH_SHORT).show();
                break;
            case android.R.id.home:
                mDrawerLayout.openDrawer(GravityCompat.START);
                break;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }


如果 setSupportActionBar(mToolbar); 这个方法报错了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

运行
在这里插入图片描述
好,关于NavigationView侧滑栏+Toolbar工具栏就讲到这里啦,欢迎小伙伴们指出问题和提出你的疑问,也希望能收到您更好的建议,谢谢您的阅读与支持,本讲就到这里啦
博主为了可以学到更多的Android知识,创建了一个安卓知识交流群,欢迎大佬入群,当然也欢迎和我一样的安卓小白,我们可以一起交流,最重要的是快乐水群,记得定个小目标,冲击bat

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46526828/article/details/107952712