【android】ToolBar与弹出侧边栏布局和SnackBar&&CoordinatorLayout

一:替换ToolBar

一.ToolBar基础替换

  1. 先将主题中的ActionBar改为Light.NoActionBar
  2. 修改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"
    />

在这里插入图片描述

  1. 这里我们发现左上角就是项目名称,来到清单文件修改label即可

在这里插入图片描述

二.ToolBar结合引入菜单

  1. res文件夹下创建menu文件夹,创建toolbar.xml的menu resourse file
  2. menu中加入app的资源地址,方便兼容,其中item组
  3. 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>
  1. 来着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

  1. 借助Google提供的DrawerLayout,实心滑动菜单这个布局可以放入两个直接子控件,第一个是主屏幕中的内容,第二个是滑动菜单中显示的内容
  2. 修改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等等,不设置只显示第二个子项

**3、**右侧主页涉及ui操作的话,偏移会恢复原来位置,包括dialog。

在这里插入图片描述

二.加入导航按钮

  1. oncreate方法中取得drawlay对象
  2. 拿到对应Actionbar实例(由ToolBar实现的)【getSupportAsUpEnabled(true)
  3. 让导航按钮显示出来【 actionBar.setDisplayHomeAsUpEnabled(true)】设置图标【setHomeAsUpIndicator()
  4. Toolba菜单项设置点击,id永远是是home,选中控制切换即可【 mDrawerLayout.openDrawer(GravityCompat.START)
  5. 点开只有一个text有点丑。。。不过没事 ,接下来用到的NavigationViw可以解决这个问题

在这里插入图片描述

三.NavigationView

一. 导包

  1. Design库
    implementation ‘com.android.support:design:24.2.1’
  2. 圆形化图片开源项目
    implementation ‘de.hdodenhof:circleimageview:2.1.0’

二. 在写之前还需要准备两个东西

  1. menu用来在NaviagtionView中显示具体的菜单项
    1)建立nav_menu后指定单选菜单项 <group android:checkableBehavior="single">
    2)接着是item项

  2. 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="2685872xxx@gmail.com"
            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>
  1. 通过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

  1. Design Support库中提供的一个控件,可以轻松的实现悬浮按钮效果。
  2. 在DrawableLayout第一主布局中ToolBar后加入该按钮,自带阴影效果,也可以自带指定app:elevation=“8dp”
  3. 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"/>
  1. 设置点击事件,和普通按钮一样,设置个click监听就好了

二.Snackbar

  1. 在监听事件中可以弹出小的个选框提示Snackbar
  2. 下面是示例代码,有点套娃,点击悬浮按钮,弹出Snack信息:开始播放,点击信息中的undo,显示取消播放
  3. 但是这个时候我们发现原本的浮动按钮被挡住了,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

  1. CoordinatorLayout可监听所有子控件【通过子控件传入的View】的各种事件,然后帮助我们做最合理的响应,我们用这个替换Fragment,就行了
  2. 由于Drawable的第二个子布局和CoordinatorLayout没多大关系,所以布局任然不会移动,相到移动方案再补充。
    在这里插入图片描述
    在这里插入图片描述
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 应用程序中实现侧边栏,可以使用 NavigationView 和 DrawerLayout 组件。 以下是实现侧边栏的基本步骤: 1. 首先,在你的布局文件中添加 DrawerLayout 组件,并将其作为根视图。 ``` <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> //主要内容区域 <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> //侧边栏 <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/nav_header" app:menu="@menu/nav_menu" /> </android.support.v4.widget.DrawerLayout> ``` 2. 在 Activity 中,将 NavigationView 组件与 DrawerLayout 组件进行关联,并设置 toggle 按钮。 ``` DrawerLayout drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); navigationView.setNavigationItemSelectedListener(this); ``` 3. 创建菜单项和头部布局。 在 res/menu 目录下创建 nav_menu.xml 文件,并在其中定义菜单项。 ``` <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_home" android:icon="@drawable/ic_home" android:title="@string/nav_home" /> <item android:id="@+id/nav_messages" android:icon="@drawable/ic_message" android:title="@string/nav_messages" /> <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings" android:title="@string/nav_settings" /> </group> </menu> ``` 在 res/layout 目录下创建 nav_header.xml 文件,并在其中定义头部布局。 ``` <ImageView android:id="@+id/nav_header_imageView" android:layout_width="match_parent" android:layout_height="180dp" android:scaleType="centerCrop" android:src="@drawable/header_image" /> <TextView android:id="@+id/nav_header_textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:paddingBottom="16dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="8dp" android:text="Your Name" android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> ``` 4. 处理菜单项点击事件。 在 Activity 中实现 NavigationView.OnNavigationItemSelectedListener 接口,并处理菜单项点击事件。 ``` @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_home) { // Handle the home action } else if (id == R.id.nav_messages) { // Handle the messages action } else if (id == R.id.nav_settings) { // Handle the settings action } DrawerLayout drawer = findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } ``` 这样就可以实现一个基本的侧边栏了。当用户从屏幕的左边缘向右滑动时,侧边栏会出现在屏幕上。用户可以点击菜单项或者在内容区域滑动以关闭侧边栏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值