• 【Android笔记04】Android基本的UI控件(Notification、Toolbar、AlertDialog、PopupWindow)


    这篇文章,主要介绍Android中基本的UI控件,包含:Notification、Toolbar、AlertDialog、PopupWindow。

    目录

    一、基础UI控件

    1.1、Notification

    (1)获取【NotificationManager】通知管理器对象

    (2)创建【Notification】通知对象

    (3)通知渠道【NotificationChannel】对象

    (4)案例代码

    1.2、Toolbar

    (1)自定义Toolbar

    (2)Toolbar属性

    1.3、AlertDialog

    (1)普通对话框

    (2)自定义布局

    1.4、PopupWindow

    (1)基础属性

    (2)组件案例


    一、基础UI控件

    1.1、Notification

    【Notification(通知)】是一个通知控件,就是我们平时手机上面可以接收到的那些推送消息提示,比如:微博推送通知,微信消息通知等等,Android中提供了Notification控件来实现通知的功能。

    由于Notification通知可以有很多,为了方便管理,Android通过【NotificationManager(通知管理器)】来统一管理Notification通知。【NotificationManager(通知管理器)】是一个基于单例模式对象,它是由系统维护的一个服务,一个应用程序只会有一个通知管理器对象。

    使用【Notification】通知之前,我们需要获取【NotificationManager】通知管理器对象,如何获取呢???

    (1)获取【NotificationManager】通知管理器对象

    Android里面给我们提供了【getSystemService(String arg)】方法,可以用于获取某个系统服务,并且每个【Activity】类都继承了这个方法,所以直接调用即可。

    【getSystemService(String arg)】方法,根据不同的参数,就可以获取不同的系统服务对象,例如:

    • 要获取NitificationManager对象,那么就可以传递一个:【getSystemService(NOTIFICATION_MANAGER)

    通过【NotificationManager】通知管理器对象中,提供的两个方法就可以实现通知的发送和取消功能,方法如下所示:

    • notify()方法:发送通知。两个参数:第一个是id(这个id唯一即可),第二个是Notification通知对象。
    • cancel()方法:取消通知。一个参数:参数是id,这个id和发送通知时候设置的id必须一致。

    【NotificationManager】通知管理器对象中,提供了【createNotificationChannel】方法,用于设置通知渠道。

    • createNotificationChannel()方法:设置通知渠道。

    (2)创建【Notification】通知对象

    当我们获取到【NotificationManager(通知管理器)】对象之后,我们就可以利用通知管理器对象的【Builder()】构造器来创建一个【Notification】通知对象。通过这种【Builder()】构造器的方式,可以保证在所有Android版本的手机上都能够生效。但是在Android 8.0版本开始,引入了通知渠道的概念,也就是【NotificationChannel】通知渠道,我们在使用通知的时候,还需要设置对应的通知渠道,这样才能够正常的使用通知功能。

    Notification通知相关方法:

    • setContentTitle:设置通知的标题。(必须设置)
    • setContentText:设置通知的具体内容。(必须设置)
    • setSmallIcon:设置通知显示的小图标,图标必须是没有颜色的(int类型的参数)。
    • setColor:设置小图标的颜色。
    • setLargeIcon:设置通知显示的大图标(bitmap类型的参数)。
    • setContentIntent:设置点击通知后的跳转位置。
    • setAutoCancel:设置点击通知后是否自动清除通知。
    • setWhen:设置通知被创建的时间。

    (3)通知渠道【NotificationChannel】对象

    Android 8.0版本引入通知渠道【NotificationChannel】这个概念,它允许我们为每个通知设置自定义的通知渠道。那具体什么是通知渠道呢???

    我们通过【NotificationChannel】类的构造方法就可以创建一个【NotificationChannel】对象,构造方法有三个参数:

    • id:通知渠道的唯一标识。
    • name:通知渠道名称。
    • importance:通知的重要程度,有5个重要程度。

    通知的5个重要程度:

    • IMPORTANCE_NONO:关闭通知。
    • IMPORTANCE_MIN:开启通知,不会弹出提示,不会有提示音,状态栏不会显示。
    • IMPORTANCE_LOW:开启通知,不会弹出,不会有提示音,只在状态栏显示。
    • IMPORTANCE_DEFAULT:开启通知,不会弹出,会有提示音,状态栏会显示。
    • IMPORTANCE_HIGH:开启通知,会弹出,会有提示音,状态栏会显示。

    (4)案例代码

    • 创建两个按钮,分别是发送通知和取消通知。
    1. <Button
    2. android:id="@+id/btn01"
    3. android:text="发送通知"
    4. android:onClick="sendNotification"
    5. android:layout_width="120dp"
    6. android:layout_height="80dp"/>
    7. <Button
    8. android:id="@+id/btn02"
    9. android:text="取消通知"
    10. android:onClick="cancelNotification"
    11. android:layout_width="120dp"
    12. android:layout_height="80dp"/>
    • 创建通知跳转之后的页面【notificationPage】。
    1. package com.android.demo;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. public class notificationPage extends AppCompatActivity {
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_notification_page);
    9. }
    10. }

    对应的XML配置文件。

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. android:orientation="vertical"
    8. tools:context=".notificationPage">
    9. <TextView
    10. android:textSize="40px"
    11. android:text="点击通知跳转到当前页面"
    12. android:layout_width="wrap_content"
    13. android:layout_height="wrap_content"/>
    14. </LinearLayout>
    • 创建通知管理器对象和通知对象。
    1. package com.android.demo;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import androidx.core.app.NotificationCompat;
    4. import android.app.Notification;
    5. import android.app.NotificationChannel;
    6. import android.app.NotificationManager;
    7. import android.app.PendingIntent;
    8. import android.content.Intent;
    9. import android.graphics.BitmapFactory;
    10. import android.graphics.Color;
    11. import android.os.Build;
    12. import android.os.Bundle;
    13. import android.util.Log;
    14. import android.view.View;
    15. public class MainActivity extends AppCompatActivity {
    16. private static final String TAG = "notification";
    17. // 通知管理器对象
    18. private NotificationManager manager;
    19. // 通知对象
    20. private Notification notification;
    21. @Override
    22. protected void onCreate(Bundle savedInstanceState) {
    23. super.onCreate(savedInstanceState);
    24. setContentView(R.layout.activity_notification);
    25. // 1、创建【NotificationManager】通知管理器对象
    26. manager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
    27. // 2、设置通知渠道
    28. // 判断是否Android 8.0版本以上
    29. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    30. // 创建【NotificationChannel】通知渠道
    31. NotificationChannel channel = new NotificationChannel("test", "通知的内容: 您有一条新的消息!", NotificationManager.IMPORTANCE_HIGH);
    32. // 通知管理器添加通知渠道
    33. manager.createNotificationChannel(channel);
    34. }
    35. // 设置跳转页面
    36. Intent intent = new Intent(this, notificationPage.class);
    37. // 创建PendingIntent
    38. PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
    39. // 3、创建【Notification】通知对象
    40. notification = new NotificationCompat.Builder(this, "test")
    41. .setContentTitle("测试通知标题")
    42. .setContentText("通知的具体内容: 长路漫漫,唯剑作伴")
    43. // 通知显示的小图标
    44. .setSmallIcon(R.drawable.ic_baseline_how_to_reg_24)
    45. // 设置小图标颜色
    46. .setColor(Color.RED)
    47. // 设置显示的大图标
    48. .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ceshi))
    49. // 设置自动取消通知
    50. .setAutoCancel(true)
    51. // 设置通知跳转页面
    52. .setContentIntent(pendingIntent)
    53. .build();
    54. }
    55. // 发送通知方法
    56. public void sendNotification(View view) {
    57. manager.notify(1, notification);
    58. }
    59. // 取消通知方法
    60. public void cancelNotification(View view) {
    61. manager.cancel(1);
    62. }
    63. }
    • 启动应用,点击【发送通知】按钮,查看效果。

     当我们打开状态栏的时候,依然可以看见刚刚的通知。

    • 当我们点击通知的时候,这个时候就会跳转到我们设置的跳转页面里面。

     以上,就是整个【Notification】通知控件的使用。

    1.2、Toolbar

    Toolbar是一个顶部工具栏控件,Toolbar不是Android包下的,它是属于Androidx包下面的控件,并且需要SDK API 29之后的版本才能够使用Androidx包。我们在使用的过程中,不要导错包了,因为Android包下面也有一个Toolbar,但是我们使用的是Androidx包下的Toolbar控件。

    默认情况下,App应用会有一个默认的Toolbar控件,是在【values】目录下的【themes】主题目录下对应的XML配置文件中设置的。

    默认的应用Toolbar导航栏效果如下所示:

     

     (1)自定义Toolbar

    有时候,我们不想使用默认的Toolbar,而是需要自定义Toolbar,那就需要将默认的Toolbar设置为【NoActionBar】,然后编写我们的自定义Toolbar代码。

    • 首先,将【themes】目录下的主题的Toolbar设置为【NoActionBar】。

    • 这个时候,再次访问应用,可以发现就没有默认的Toolbar导航栏了。

    • 创建一个【customToolbar】的Activity,在对应的XML配置文件里面添加【Toolbar】。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <androidx.appcompat.widget.Toolbar
    8. app:title="自定义导航栏"
    9. android:background="#FF0000"
    10. android:layout_width="match_parent"
    11. android:layout_height="?attr/actionBarSize"/>
    12. <androidx.appcompat.widget.Toolbar
    13. app:title="自定义导航栏"
    14. app:titleTextColor="@color/white"
    15. app:navigationIcon="@drawable/ic_baseline_how_to_reg_24"
    16. android:background="#FF00FF"
    17. android:layout_width="match_parent"
    18. android:layout_height="?attr/actionBarSize"/>
    19. <androidx.appcompat.widget.Toolbar
    20. app:title="自定义导航栏"
    21. app:titleTextColor="@color/black"
    22. app:logo="@mipmap/ic_launcher"
    23. android:background="#FFFF00"
    24. android:layout_width="match_parent"
    25. android:layout_height="?attr/actionBarSize"/>
    26. <androidx.appcompat.widget.Toolbar
    27. app:title="自定义导航栏"
    28. app:titleTextColor="@color/black"
    29. app:navigationIcon="@drawable/ic_baseline_arrow_back_ios_24"
    30. android:background="#FFAAFA"
    31. android:layout_width="match_parent"
    32. android:layout_height="?attr/actionBarSize"/>
    33. </LinearLayout>
    • 启动应用,就可以看到我们自定义的Toolbar效果。

     (2)Toolbar属性

    Toolbar中的属性大部分都是使用【app】开头的,具有如下常用的属性:

    • title:导航标题。
    • titleTextColor:导航标题字体颜色。
    • titleMarginStart:设置导航距离左侧的间距。
    • subTitle:导航子标题。
    • subTitleTextColor:导航子标题字体颜色。
    • logo:导航的logo。
    • navigationIcon:设置导航的图标。

    下面做一个导航标题居中,并且具有返回箭头的Toolbar案例。

    • 添加XML布局配置文件。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <androidx.appcompat.widget.Toolbar
    8. android:id="@+id/tb01"
    9. app:navigationIcon="@drawable/ic_baseline_arrow_back_ios_24"
    10. android:background="#FFFF0F"
    11. android:layout_width="match_parent"
    12. android:layout_height="?attr/actionBarSize">
    13. <TextView
    14. android:text="微信"
    15. android:textSize="25sp"
    16. android:textStyle="bold"
    17. android:gravity="center"
    18. android:layout_gravity="center"
    19. android:layout_width="wrap_content"
    20. android:layout_height="wrap_content"/>
    21. </androidx.appcompat.widget.Toolbar>
    22. </LinearLayout>
    • 在【Activity】的类里面,获取Toolbar对象,然后设置点击事件。
    1. // 获取Toolbar对象
    2. Toolbar toolbar = findViewById(R.id.tb01);
    3. // 监听点击事件
    4. toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    5. @Override
    6. public void onClick(View v) {
    7. Log.i(TAG, "点击了Toolbar的返回图标");
    8. }
    9. });
    • 启动应用,点击返回图标,查看控制台输出日志。

     以上,就是Toolbar控件的相关使用。

    1.3、AlertDialog

    AlertDialog是一个弹出框组件,它是属于【androidx】包下面的组件,可以通过直接创建一个【AlertDialog.Builder()】对象来创建,AlertDialog具有如下方法:

    • setIcon:设置弹出框图标。
    • setTitle:设置弹出框标题。
    • setMessage:设置弹出框的消息内容。
    • setView:自定义内容布局。
    • create:创建AlertDialog对象。
    • show:显示对话框。
    • setPositiveButton:确定按钮。
    • setNegativeButton:取消按钮。
    • setNeutralButton:中间按钮(这个我还不知道啥意思)。

    (1)普通对话框

    • 创建XML布局文件,添加按钮,用于点击时候弹出对话框。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <Button
    8. android:id="@+id/btn01"
    9. android:text="弹出对话框"
    10. android:onClick="alertDialogMethod"
    11. android:layout_width="wrap_content"
    12. android:layout_height="wrap_content"/>
    13. </LinearLayout>
    • 添加按钮点击事件处理的方法,然后在方法里面创建对话框。
    1. // 弹出对话框
    2. public void alertDialogMethod(View view) {
    3. // 创建构建器对象
    4. AlertDialog.Builder builder = new AlertDialog.Builder(this);
    5. // 设置对话框属性
    6. builder.setIcon(R.drawable.ic_baseline_alarm_on_24)
    7. // 标题
    8. .setTitle("对话框标题")
    9. // 消息内容
    10. .setMessage("这是对话框的消息内容")
    11. // 确定按钮
    12. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    13. @Override
    14. public void onClick(DialogInterface dialog, int which) {
    15. Log.i(TAG, "点击对话框的确定按钮");
    16. }
    17. })
    18. // 取消按钮
    19. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
    20. @Override
    21. public void onClick(DialogInterface dialog, int which) {
    22. Log.i(TAG, "点击对话框的取消按钮");
    23. }
    24. })
    25. // 中间按钮
    26. .setNeutralButton("中间", new DialogInterface.OnClickListener() {
    27. @Override
    28. public void onClick(DialogInterface dialog, int which) {
    29. Log.i(TAG, "点击对话框的中间按钮");
    30. }
    31. })
    32. // 创建对话框
    33. .create()
    34. // 显示对话框
    35. .show();
    36. }
    • 启动应用,点击按钮,查看控制台输出日志,以及页面弹出的对话框效果。

    (2)自定义布局

    通过设置【setView】,我们可以实现对话框的自定义布局。

    • 创建一个布局XML配置文件,用于编写自定义布局。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical"
    7. android:background="#FF00FF00">
    8. <TextView
    9. android:text="自定义布局页面"
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"/>
    12. <ImageView
    13. android:src="@drawable/ceshi"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:maxHeight="100dp"
    17. android:adjustViewBounds="true"/>
    18. </LinearLayout>
    • 在对应的Activity类里面,获取layout对象,然后设置【setView】布局即可。
    1. // 弹出对话框
    2. public void alertDialogMethod(View view) {
    3. // 获取layout布局
    4. View customDialog = getLayoutInflater().inflate(R.layout.activity_custom_dialog, null);
    5. // 创建构建器对象
    6. AlertDialog.Builder builder = new AlertDialog.Builder(this);
    7. // 设置对话框属性
    8. builder.setIcon(R.drawable.ic_baseline_alarm_on_24)
    9. // 标题
    10. .setTitle("对话框标题")
    11. // 消息内容
    12. .setMessage("这是对话框的消息内容")
    13. // 确定按钮
    14. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    15. @Override
    16. public void onClick(DialogInterface dialog, int which) {
    17. Log.i(TAG, "点击对话框的确定按钮");
    18. }
    19. })
    20. // 取消按钮
    21. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
    22. @Override
    23. public void onClick(DialogInterface dialog, int which) {
    24. Log.i(TAG, "点击对话框的取消按钮");
    25. }
    26. })
    27. // 中间按钮
    28. .setNeutralButton("中间", new DialogInterface.OnClickListener() {
    29. @Override
    30. public void onClick(DialogInterface dialog, int which) {
    31. Log.i(TAG, "点击对话框的中间按钮");
    32. }
    33. })
    34. // 设置自定义布局
    35. .setView(customDialog)
    36. // 创建对话框
    37. .create()
    38. // 显示对话框
    39. .show();
    40. }
    • 启动应用,点击按钮,查看自定义对话框的布局样式。

     以上,就是AlertDialog对话框组件的使用。

    1.4、PopupWindow

    PopupWindow是一个弹出框组件,它是属于【androidx】包下面的组件,具有如下属性:

    (1)基础属性

    PopupWindow常用的属性有如下这些:

    • setContentView:设置PopupWindow的显示的View页面。
    • showAsDropDown:相对某个控件的位置显示。可以设置偏移量。
    • setFocusable:设置是否获取焦点(可以实现失去焦点后,自动关闭popupwindow)。
    • setBackgroundDrawable:设置背景。
    • dismiss:关闭弹出框。

    (2)组件案例

    • 创建PopupWindow里面的XML布局页面。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical"
    7. android:background="#FF00FF00">
    8. <TextView
    9. android:text="PopupWindow弹出页面"
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"/>
    12. <Button
    13. android:id="@+id/btn01"
    14. android:text="按钮01"
    15. android:layout_width="wrap_content"
    16. android:layout_height="wrap_content"/>
    17. <Button
    18. android:id="@+id/btn02"
    19. android:text="按钮02"
    20. android:layout_width="wrap_content"
    21. android:layout_height="wrap_content"/>
    22. </LinearLayout>
    • 创建主页面的按钮页面。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <Button
    8. android:id="@+id/btn01"
    9. android:text="PopupWindow弹出框"
    10. android:onClick="popupWindowMethod"
    11. android:layout_width="wrap_content"
    12. android:layout_height="wrap_content"/>
    13. </LinearLayout>
    • 在java类中创建PopupWindow对象,然后设置显示的布局。
    1. // PopupWindow弹出框
    2. public void popupWindowMethod(View view) {
    3. // 创建放入PopupWindow里面的View页面
    4. View popupView = getLayoutInflater().inflate(R.layout.activity_popup_view, null);
    5. // 创建PopupWindow对象
    6. PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT,
    7. ViewGroup.LayoutParams.WRAP_CONTENT, true);
    8. // 显示弹出框
    9. popupWindow.showAsDropDown(view);
    10. // 获取按钮
    11. Button btn01 = popupView.findViewById(R.id.btn01);
    12. Button btn02 = popupView.findViewById(R.id.btn02);
    13. // 监听事件
    14. btn01.setOnClickListener(new View.OnClickListener() {
    15. @Override
    16. public void onClick(View v) {
    17. Log.i(TAG, "点击了按钮01");
    18. }
    19. });
    20. btn02.setOnClickListener(new View.OnClickListener() {
    21. @Override
    22. public void onClick(View v) {
    23. Log.i(TAG, "点击了按钮02, 并且关闭PopupWindow");
    24. popupWindow.dismiss();
    25. }
    26. });
    27. }
    • 启动应用,点击按钮,查看控制台输出,以及页面弹出的PopupWindow效果。

     以上,就是PopupWindow组件的相关使用。

    综上,这篇文章介绍了,主要介绍了Android中基本的UI控件,包含:Notification、Toolbar、AlertDialog、PopupWindow。

  • 相关阅读:
    道德风险与信贷配给
    Java线程池的任务消息队列
    U盘恢复怎么做?3个宝藏方法分享!
    链表及其基本操作
    linux 安装 RocketMQ 超详细教程(付安装包)
    天翼云江西分公司副总经理彭越华一行莅临拓世科技集团指导考察,共绘蓝图开启智能新篇章
    基于Java解决容量设施选址问题
    Easy-Classification-分类框架设计
    经纬恒润48V BMS助力Stellantis量产落地
    SettingsProvider
  • 原文地址:https://blog.csdn.net/qq_39826207/article/details/125425508