这篇文章,主要介绍Android中基本的UI控件,包含:Notification、Toolbar、AlertDialog、PopupWindow。
目录
(1)获取【NotificationManager】通知管理器对象
(3)通知渠道【NotificationChannel】对象
【Notification(通知)】是一个通知控件,就是我们平时手机上面可以接收到的那些推送消息提示,比如:微博推送通知,微信消息通知等等,Android中提供了Notification控件来实现通知的功能。
由于Notification通知可以有很多,为了方便管理,Android通过【NotificationManager(通知管理器)】来统一管理Notification通知。【NotificationManager(通知管理器)】是一个基于单例模式对象,它是由系统维护的一个服务,一个应用程序只会有一个通知管理器对象。
使用【Notification】通知之前,我们需要获取【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()方法:设置通知渠道。
当我们获取到【NotificationManager(通知管理器)】对象之后,我们就可以利用通知管理器对象的【Builder()】构造器来创建一个【Notification】通知对象。通过这种【Builder()】构造器的方式,可以保证在所有Android版本的手机上都能够生效。但是在Android 8.0版本开始,引入了通知渠道的概念,也就是【NotificationChannel】通知渠道,我们在使用通知的时候,还需要设置对应的通知渠道,这样才能够正常的使用通知功能。
Notification通知相关方法:
- setContentTitle:设置通知的标题。(必须设置)
- setContentText:设置通知的具体内容。(必须设置)
- setSmallIcon:设置通知显示的小图标,图标必须是没有颜色的(int类型的参数)。
- setColor:设置小图标的颜色。
- setLargeIcon:设置通知显示的大图标(bitmap类型的参数)。
- setContentIntent:设置点击通知后的跳转位置。
- setAutoCancel:设置点击通知后是否自动清除通知。
- setWhen:设置通知被创建的时间。
Android 8.0版本引入通知渠道【NotificationChannel】这个概念,它允许我们为每个通知设置自定义的通知渠道。那具体什么是通知渠道呢???
我们通过【NotificationChannel】类的构造方法就可以创建一个【NotificationChannel】对象,构造方法有三个参数:
通知的5个重要程度:
- IMPORTANCE_NONO:关闭通知。
- IMPORTANCE_MIN:开启通知,不会弹出提示,不会有提示音,状态栏不会显示。
- IMPORTANCE_LOW:开启通知,不会弹出,不会有提示音,只在状态栏显示。
- IMPORTANCE_DEFAULT:开启通知,不会弹出,会有提示音,状态栏会显示。
- IMPORTANCE_HIGH:开启通知,会弹出,会有提示音,状态栏会显示。
- <Button
- android:id="@+id/btn01"
- android:text="发送通知"
- android:onClick="sendNotification"
- android:layout_width="120dp"
- android:layout_height="80dp"/>
-
- <Button
- android:id="@+id/btn02"
- android:text="取消通知"
- android:onClick="cancelNotification"
- android:layout_width="120dp"
- android:layout_height="80dp"/>
- package com.android.demo;
-
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.os.Bundle;
-
- public class notificationPage extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_notification_page);
- }
- }
对应的XML配置文件。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout 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:orientation="vertical"
- tools:context=".notificationPage">
-
- <TextView
- android:textSize="40px"
- android:text="点击通知跳转到当前页面"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- </LinearLayout>
- package com.android.demo;
-
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.core.app.NotificationCompat;
-
- import android.app.Notification;
- import android.app.NotificationChannel;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.graphics.BitmapFactory;
- import android.graphics.Color;
- import android.os.Build;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
-
- public class MainActivity extends AppCompatActivity {
-
- private static final String TAG = "notification";
-
- // 通知管理器对象
- private NotificationManager manager;
- // 通知对象
- private Notification notification;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_notification);
-
- // 1、创建【NotificationManager】通知管理器对象
- manager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
- // 2、设置通知渠道
- // 判断是否Android 8.0版本以上
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- // 创建【NotificationChannel】通知渠道
- NotificationChannel channel = new NotificationChannel("test", "通知的内容: 您有一条新的消息!", NotificationManager.IMPORTANCE_HIGH);
- // 通知管理器添加通知渠道
- manager.createNotificationChannel(channel);
- }
-
- // 设置跳转页面
- Intent intent = new Intent(this, notificationPage.class);
- // 创建PendingIntent
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
-
- // 3、创建【Notification】通知对象
- notification = new NotificationCompat.Builder(this, "test")
- .setContentTitle("测试通知标题")
- .setContentText("通知的具体内容: 长路漫漫,唯剑作伴")
- // 通知显示的小图标
- .setSmallIcon(R.drawable.ic_baseline_how_to_reg_24)
- // 设置小图标颜色
- .setColor(Color.RED)
- // 设置显示的大图标
- .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ceshi))
- // 设置自动取消通知
- .setAutoCancel(true)
- // 设置通知跳转页面
- .setContentIntent(pendingIntent)
- .build();
- }
-
- // 发送通知方法
- public void sendNotification(View view) {
- manager.notify(1, notification);
- }
- // 取消通知方法
- public void cancelNotification(View view) {
- manager.cancel(1);
- }
-
- }
当我们打开状态栏的时候,依然可以看见刚刚的通知。
以上,就是整个【Notification】通知控件的使用。
Toolbar是一个顶部工具栏控件,Toolbar不是Android包下的,它是属于Androidx包下面的控件,并且需要SDK API 29之后的版本才能够使用Androidx包。我们在使用的过程中,不要导错包了,因为Android包下面也有一个Toolbar,但是我们使用的是Androidx包下的Toolbar控件。
默认情况下,App应用会有一个默认的Toolbar控件,是在【values】目录下的【themes】主题目录下对应的XML配置文件中设置的。
默认的应用Toolbar导航栏效果如下所示:
有时候,我们不想使用默认的Toolbar,而是需要自定义Toolbar,那就需要将默认的Toolbar设置为【NoActionBar】,然后编写我们的自定义Toolbar代码。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <androidx.appcompat.widget.Toolbar
- app:title="自定义导航栏"
- android:background="#FF0000"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"/>
-
- <androidx.appcompat.widget.Toolbar
- app:title="自定义导航栏"
- app:titleTextColor="@color/white"
- app:navigationIcon="@drawable/ic_baseline_how_to_reg_24"
- android:background="#FF00FF"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"/>
-
- <androidx.appcompat.widget.Toolbar
- app:title="自定义导航栏"
- app:titleTextColor="@color/black"
- app:logo="@mipmap/ic_launcher"
- android:background="#FFFF00"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"/>
-
- <androidx.appcompat.widget.Toolbar
- app:title="自定义导航栏"
- app:titleTextColor="@color/black"
- app:navigationIcon="@drawable/ic_baseline_arrow_back_ios_24"
- android:background="#FFAAFA"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"/>
-
- </LinearLayout>
Toolbar中的属性大部分都是使用【app】开头的,具有如下常用的属性:
- title:导航标题。
- titleTextColor:导航标题字体颜色。
- titleMarginStart:设置导航距离左侧的间距。
- subTitle:导航子标题。
- subTitleTextColor:导航子标题字体颜色。
- logo:导航的logo。
- navigationIcon:设置导航的图标。
下面做一个导航标题居中,并且具有返回箭头的Toolbar案例。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <androidx.appcompat.widget.Toolbar
- android:id="@+id/tb01"
- app:navigationIcon="@drawable/ic_baseline_arrow_back_ios_24"
- android:background="#FFFF0F"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize">
- <TextView
- android:text="微信"
- android:textSize="25sp"
- android:textStyle="bold"
- android:gravity="center"
- android:layout_gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </androidx.appcompat.widget.Toolbar>
-
- </LinearLayout>
- // 获取Toolbar对象
- Toolbar toolbar = findViewById(R.id.tb01);
- // 监听点击事件
- toolbar.setNavigationOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.i(TAG, "点击了Toolbar的返回图标");
- }
- });
以上,就是Toolbar控件的相关使用。
AlertDialog是一个弹出框组件,它是属于【androidx】包下面的组件,可以通过直接创建一个【AlertDialog.Builder()】对象来创建,AlertDialog具有如下方法:
- setIcon:设置弹出框图标。
- setTitle:设置弹出框标题。
- setMessage:设置弹出框的消息内容。
- setView:自定义内容布局。
- create:创建AlertDialog对象。
- show:显示对话框。
- setPositiveButton:确定按钮。
- setNegativeButton:取消按钮。
- setNeutralButton:中间按钮(这个我还不知道啥意思)。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <Button
- android:id="@+id/btn01"
- android:text="弹出对话框"
- android:onClick="alertDialogMethod"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- </LinearLayout>
- // 弹出对话框
- public void alertDialogMethod(View view) {
- // 创建构建器对象
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- // 设置对话框属性
- builder.setIcon(R.drawable.ic_baseline_alarm_on_24)
- // 标题
- .setTitle("对话框标题")
- // 消息内容
- .setMessage("这是对话框的消息内容")
- // 确定按钮
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG, "点击对话框的确定按钮");
- }
- })
- // 取消按钮
- .setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG, "点击对话框的取消按钮");
- }
- })
- // 中间按钮
- .setNeutralButton("中间", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG, "点击对话框的中间按钮");
- }
- })
- // 创建对话框
- .create()
- // 显示对话框
- .show();
- }
通过设置【setView】,我们可以实现对话框的自定义布局。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="#FF00FF00">
-
- <TextView
- android:text="自定义布局页面"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- <ImageView
- android:src="@drawable/ceshi"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:maxHeight="100dp"
- android:adjustViewBounds="true"/>
-
- </LinearLayout>
- // 弹出对话框
- public void alertDialogMethod(View view) {
- // 获取layout布局
- View customDialog = getLayoutInflater().inflate(R.layout.activity_custom_dialog, null);
- // 创建构建器对象
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- // 设置对话框属性
- builder.setIcon(R.drawable.ic_baseline_alarm_on_24)
- // 标题
- .setTitle("对话框标题")
- // 消息内容
- .setMessage("这是对话框的消息内容")
- // 确定按钮
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG, "点击对话框的确定按钮");
- }
- })
- // 取消按钮
- .setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG, "点击对话框的取消按钮");
- }
- })
- // 中间按钮
- .setNeutralButton("中间", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG, "点击对话框的中间按钮");
- }
- })
- // 设置自定义布局
- .setView(customDialog)
- // 创建对话框
- .create()
- // 显示对话框
- .show();
- }
以上,就是AlertDialog对话框组件的使用。
PopupWindow是一个弹出框组件,它是属于【androidx】包下面的组件,具有如下属性:
PopupWindow常用的属性有如下这些:
- setContentView:设置PopupWindow的显示的View页面。
- showAsDropDown:相对某个控件的位置显示。可以设置偏移量。
- setFocusable:设置是否获取焦点(可以实现失去焦点后,自动关闭popupwindow)。
- setBackgroundDrawable:设置背景。
- dismiss:关闭弹出框。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="#FF00FF00">
-
- <TextView
- android:text="PopupWindow弹出页面"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- <Button
- android:id="@+id/btn01"
- android:text="按钮01"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- <Button
- android:id="@+id/btn02"
- android:text="按钮02"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- </LinearLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <Button
- android:id="@+id/btn01"
- android:text="PopupWindow弹出框"
- android:onClick="popupWindowMethod"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- </LinearLayout>
- // PopupWindow弹出框
- public void popupWindowMethod(View view) {
- // 创建放入PopupWindow里面的View页面
- View popupView = getLayoutInflater().inflate(R.layout.activity_popup_view, null);
- // 创建PopupWindow对象
- PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT, true);
- // 显示弹出框
- popupWindow.showAsDropDown(view);
- // 获取按钮
- Button btn01 = popupView.findViewById(R.id.btn01);
- Button btn02 = popupView.findViewById(R.id.btn02);
- // 监听事件
- btn01.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.i(TAG, "点击了按钮01");
- }
- });
- btn02.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.i(TAG, "点击了按钮02, 并且关闭PopupWindow");
- popupWindow.dismiss();
- }
- });
- }
以上,就是PopupWindow组件的相关使用。
综上,这篇文章介绍了,主要介绍了Android中基本的UI控件,包含:Notification、Toolbar、AlertDialog、PopupWindow。