【Android】Material Design编写更好的UI

2024-09-01 19:44

本文主要是介绍【Android】Material Design编写更好的UI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Toolbar

对于控件ActionBar我们非常熟悉,就是我们常见的标题栏,但ActionBar只能位于活动的顶部,因此我们更建议使用Toolbar。在新建一个项目的时候都是默认显示ActionBar,我们要使用Toolbar就需要先将标题栏改为不显示

先来看看界面各个部位的属性:

在这里插入图片描述

colorAccent:不只用来指定这样一个按钮的颜色,而是更多表达了一个强调的意思,例如一些控件的选中状态也会使用colorAccent的颜色

基本使用:

接下来就看看Toolbar的使用:

<androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="@color/black"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

layout_height:这个属性我们非常熟悉了,但对于后面进行一下解释,?attr/actionBarSize 是一个主题属性引用,它引用了当前主题中定义的 ActionBar 的标准高度

android:theme:将 Toolbar 的主题设置为暗色主题

app:popupTheme:当我们为标题添加菜单按钮的时候按钮也会是暗色的主题,页面就会非常不和谐,因此将标题设置为淡色主题

接下来就看看主活动当中的设置:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {actionBar.setDisplayHomeAsUpEnabled(true); /*actionBar.setHomeAsUpIndicator(R.drawable.ic_launcher_foreground);*/
}

setDisplayHomeAsUpEnabled():设置了 ActionBarhomeAsUp 属性为 truehomeAsUp 属性的作用是让 ActionBar 的左侧显示一个向上导航的按钮(通常是一个箭头图标),点击这个按钮可以触发向上导航的行为。调用这个方法并传入 true 会启用这个按钮。如果用户点击这个按钮,它会调用 onOptionsItemSelected 方法,并传入 android.R.id.home 作为 itemId 参数。你可以在这个方法中处理点击事件,比如导航回上一个 Activity

setHomeAsUpIndicator():就是为这个按钮设置图标,当我们不设置的时候就会使用默认的图标,运行程序,如下图所示:

在这里插入图片描述

尝试为左上角的导航按钮注册点击事件,使按下按钮但回到上一个活动:

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {//android.R.id.home 是 Android 框架中定义的一个资源 ID,它代表了 ActionBar 中的“向上”或“返回首页”按钮的点击事件的IDif (item.getItemId() == android.R.id.home) {finish();return true;}return super.onOptionsItemSelected(item);
}

添加菜单:

我们先设置一个目录:

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/home"android:icon="@drawable/ic_launcher_foreground"android:title="home"app:showAsAction="always"/><itemandroid:id="@+id/find"android:icon="@drawable/ic_launcher_foreground"android:title="find"app:showAsAction="ifRoom"/><itemandroid:id="@+id/my"android:icon="@drawable/ic_launcher_foreground"android:title="my"app:showAsAction="never"/>
</menu>

将目录加载在Toolbar上:

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

此时运行程序:

在这里插入图片描述

在这里插入图片描述

为什么会出现这样的分布,就是我们在设置目录的时候设置的app:showAsAction属性,

app:showAsAction 属性可以设置的一些值及其含义:

  • always: 总是显示在 Toolbar 上。不论 Toolbar 上有多少其他菜单项,这个菜单项都会直接显示在 Toolbar
  • ifRoom: 如果 Toolbar 上有足够空间,就显示在 Toolbar 上。如果空间不足,它会被放置在溢出菜单(Overflow Menu)中
  • never: 从不直接显示在 Toolbar 上,总是位于溢出菜单中

滑动菜单

DrawerLayout

NavigationView

先给大家介绍如何将一个图片设置为圆形,首先需要添加依赖:

implementation("de.hdodenhof:circleimageview:3.1.0")
  1. 首先我们制定一个目录,将所有的子目录放在一个group(组)当中,为其设置属性为single
<menu xmlns:android="http://schemas.android.com/apk/res/android"><group android:checkableBehavior="single"><itemandroid:id="@+id/home1"android:icon="@drawable/ic_launcher_foreground"android:title="find"/><itemandroid:id="@+id/find1"android:icon="@drawable/ic_launcher_foreground"android:title="find"/><itemandroid:id="@+id/my1"android:icon="@drawable/ic_launcher_foreground"android:title="my"/></group></menu>

android:checkableBehavior属性补充:

  1. None: 这是默认值。当设置为 None 时,视图可以独立地被选中或取消选中,不会影响其他具有相同 android:checkable 属性的视图。
  2. Single: 当设置为 Single 时,如果一个视图被选中,其他所有具有相同 android:checkable 属性的视图将自动取消选中。这个行为通常用于单选按钮(RadioButton)组,确保用户在一组选项中只能选择一个。
  3. All: 这个值实际上并不存在于 android:checkableBehavior 属性中。可能是你想要表达的是 Toggle 行为,当设置为 Toggle 时,视图会在被点击时在选中和未选中状态之间切换,这通常用于复选框(CheckBox)
  1. 我们为滑倒出来的布局设置一个头布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:padding="10dp"android:layout_height="match_parent"><de.hdodenhof.circleimageview.CircleImageViewandroid:id="@+id/iconimg"android:layout_width="70dp"android:layout_height="70dp"android:src="@drawable/draw1"android:layout_centerInParent="true"/><TextViewandroid:id="@+id/mailtext"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentBottom="true"android:layout_marginStart="10dp"android:layout_marginBottom="241dp"android:text="123456789@qq.com"android:textSize="15sp" /><TextViewandroid:id="@+id/userText"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/iconimg"android:layout_alignParentStart="true"android:layout_marginStart="20dp"android:layout_marginTop="153dp"android:gravity="start"android:text="自然醒"android:textSize="15sp" /></RelativeLayout>
  1. 修改活动中的布局,将之前的线性布局转换为:
<com.google.android.material.navigation.NavigationViewandroid: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" />
  1. 此时我们就可以通过向右划动将布局显示出来,修改活动的代码:
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
//将一开始的选择默认设置为find1
navigationView.setCheckedItem(R.id.find1);
//注册选项的点击事件
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {drawrLayout.closeDrawers();return true;}
});

运行程序:

在这里插入图片描述

悬浮按钮和可交互提示

FloatingActionButton

这个控件可以轻松的实现悬浮按钮的效果,使用与Button一样

<com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:layout_margin="30dp"android:src="@drawable/draw11"//设置悬浮的高度                                                         android:elevation="8dp"/>

在这里插入图片描述

SnackBar

在前面我们经常使用Toast来提示用户,但并没有让用户有选择的权力。这个控件就可以让用户可以根据提示进行选择:

FloatingActionButton floatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
floatingActionButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Snackbar.make(v, "data delete", Snackbar.LENGTH_SHORT).setAction("Undo", new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(DrawrLayout.this, "data restored", Toast.LENGTH_SHORT).show();}}).show();}
});

此时运行程序:

在这里插入图片描述

按下悬浮按钮就会出现提示,无论你是否按下UNDO按钮到时间都会消失,当按下UNDO按钮就会根据我们的代码出现Toast提示。

CoordinatorLayout

相当于一个增强版的Framelayout,可以监听页面的子控件,然后做出合理响应。例如在上面的示例当中,当悬浮窗位于页面的右下角,按下悬浮按钮,提示弹窗弹出的时候就会遮住一部分按钮,看起来体验非常不好,当布局设置为CoordinatorLayout,按下悬浮按钮,提示弹出的时候按钮也会相应的向上移动。

卡片式布局

实际上MaterialCardView也属于FrameLayout,只是额外提供了阴影和圆角等效果。让内容显示在一张卡片当中,拥有圆角和投影

CardView

  1. 先设置RecyclerView子布局:
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_margin="5dp"app:cardCornerRadius="4dp"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/FruitImage"android:layout_width="match_parent"android:layout_height="100dp"android:scaleType="centerCrop"/><TextViewandroid:id="@+id/FruitText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_margin="5dp"android:textSize="16sp"/></LinearLayout></com.google.android.material.card.MaterialCardView>
  1. 与RecyclerView的制作一样,运行程序:

在这里插入图片描述

文章到这里就结束了!

这篇关于【Android】Material Design编写更好的UI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127869

相关文章

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j