本文简要介绍安卓自定义toast的原理及实现

安卓本身自带的toast功能,简单易用,只要可以满足绝大多数的需求

Toast.makeText(this, "This is a toast!", Toast.LENGTH_SHORT).show();

若是有自定义toast的需求,可以用以下方法实现

注意:本文没有实现自定义duration,因为如果设置为任意数值,将会被系统转换成Toast.LENGTH_SHORT.

大致思路

1,为自定义toast写一个layout文件,并加载

2,创建一个Toast

3,设置toast的View

4,初始化layout中的各种组件

话不多说,用代码表示,如下

首先创建一个简单的layout文件toast_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/toast_image"android:layout_width="20dp"android:layout_height="20dp" /><TextViewandroid:id="@+id/toast_message"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="14sp"android:gravity="center_vertical"/></LinearLayout>

定义一个toast类MyToast2(MyToast1)我会在 之后讲,稍微麻烦一点

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;public class MyToast2 {public Toast myToast;//创建一个toastpublic View view;//用于加载toast的viewpublic ImageView image;//分别是view中的两个 组件public TextView message;//初始化函数,创建toast,加载view,初始化view,image,layoutpublic MyToast2(Context context) {myToast = new Toast(context);view = LayoutInflater.from(context).inflate(R.layout.toast_layout, null);image = (ImageView) view.findViewById(R.id.toast_image);message = (TextView) view.findViewById(R.id.toast_message);}//对toast的各项 进行设置public MyToast2 setToast(String message, int image, boolean isShown, int gravity,int duration) {myToast.setView(view);//设置toast的view为加载入的布局this.message.setText(message.isEmpty() ? "null" : message);//设置消息//根据是否需要显示图标(布局文件中加入了一个图标),进行对图标内容和可见性的设定if (isShown) {this.image.setVisibility(View.VISIBLE);this.image.setBackgroundResource(image);} else {this.image.setVisibility(View.GONE);}//设置gravitythis.myToast.setGravity(gravity, 0, 0);//设置持续时间this.myToast.setDuration(duration);return this;}//显示toastpublic void show() {this.myToast.show();}
}

使用的时候初始化即可

final MyToast2 toast2 = new MyToast2(this);toast2.setToast("这是第二个toast", R.drawable.ic_launcher_background,true, Gravity.CENTER, Toast.LENGTH_SHORT);
toast.show();

效果如下(没有美工,有点丑,见谅)

接下来就要说我之前提到的第一个MyToast了,思想和上面的MyToast2完全一致,仅仅是换了一个使用方法

MyToast模仿安卓自身的通知的build方法,使用静态内部类完成这个功能,不做过多解释,有Java基础的应该能看懂

import android.content.Context;
import android.support.annotation.DrawableRes;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;public class MyToast {//根据xml布局中的定义,在MyToast中定义这些组件public Toast myToast;public View  myToastView;public TextView myToastMessage;public ImageView myToastImage;//构造函数简单地初始化这些组件public MyToast(Context context) {myToast = new Toast(context);myToastView = LayoutInflater.from(context).inflate(R.layout.toast_layout, null);myToastMessage = (TextView) myToastView.findViewById(R.id.toast_message);myToastImage = (ImageView) myToastView.findViewById(R.id.toast_image);}public void show() {this.myToast.show();}//仿照安卓通知的模式,定义一个Builder,个人觉得方便好用,方便重用//这里需要试用到安卓静态内部类//Builder类开始public static class Builder {//一下分别是toast的一些属性private String message;private int imageID;private int gravity = Gravity.CENTER;private boolean isShowIcon;private int duration = Toast.LENGTH_SHORT;//以下两个分别是构造toast的时候要用到的资源private Context context;private MyToast toast;//构造函数,主要功能是获取上下文public Builder(Context context) {this.context = context;}//分别是设置资源值的方法public Builder setMessage(String message) {this.message = message;return this;}public Builder setImage(@DrawableRes int id) {this.imageID = id;return this;}public Builder setGravity(int gravity) {this.gravity = gravity;return this;}public Builder shownAble(boolean b) {this.isShowIcon = b;return this;}public Builder setDuration(int duration) {this.duration = duration;return this;}public MyToast build() {if (toast == null) {toast = new MyToast(context);}//检查是否显示toast的图像if (isShowIcon) {toast.myToastImage.setVisibility(View.VISIBLE);toast.myToastImage.setBackgroundResource(imageID);} else {toast.myToastImage.setVisibility(View.GONE);}toast.myToast.setView(toast.myToastView);toast.myToastMessage.setText(message.isEmpty() ? "null" : message);toast.myToast.setDuration(duration);toast.myToast.setGravity(gravity, 0, 0);return toast;}}//Builder类结束}

使用方法demo如下

final MyToast toast = new MyToast.Builder(this).setDuration(Toast.LENGTH_LONG).setMessage("这是第一个自定义Toast").setGravity(Gravity.CENTER).setImage(R.drawable.ic_launcher_background).shownAble(true).build();

怎么样,是不是个安卓自带的通知build方法差不多呢?写起来麻烦点,不过用起来舒服

调用toast.show()即可显示,效果如下(同样丑)

完整的mianactivity如下

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {private Button button1, button2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//用第一种方法使用toastfinal MyToast toast = new MyToast.Builder(this).setDuration(Toast.LENGTH_LONG).setMessage("这是第一个自定义Toast").setGravity(Gravity.CENTER).setImage(R.drawable.ic_launcher_background).shownAble(true).build();//用第二种方法使用toastfinal MyToast2 toast2 = new MyToast2(this);toast2.setToast("这是第二个toast", R.drawable.ic_launcher_background,true, Gravity.CENTER, Toast.LENGTH_SHORT);//初始化button1,button1 = (Button) findViewById(R.id.button1);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {toast.show();}});button2 = (Button) findViewById(R.id.button2);button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {toast2.show();}});}
}

写的很粗糙,希望给和我一样的初学者一点帮助

安卓自定义Toast的原理及实现相关推荐

  1. 安卓自定义View进阶-事件分发机制原理

    之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识 ...

  2. 安卓Toast随时跟新以及自定义Toast

    文章目录 一.随时更新Toast 二.自定义Toast 一.随时更新Toast 创建工具类形式: package com.example.myapplication.until;import andr ...

  3. android源码学习-Toast实现原理讲解

    前言: 前些日志QQ群有朋友发了一个Toast的崩溃日志.Toast如此简单的用法怎么会崩溃呢?所以顺便就学习了一下Toast在源码中的实现,不算复杂,但内容挺多的,这里就来分享一下,方便读者. 一. ...

  4. Android开发之自定义Toast(带详细注释)

    因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...

  5. Android 自定义 Toast

    前言 安卓原生Toast只提供了两种展示方式 即 Toast.LENGTH_LONG 或者Toast.LENGTH_SHORT ,但这远远满足不了产品经理的各种需求, 所以本文展示的就是一个可自定义位 ...

  6. 火山安卓自定义列表框简单操作教程

    本源码转载自利快云https://www.lkuaiy.com/ 火山安卓自定义列表框简单操作教程   一.列表项布局设计 1.简单的在布局器中放两个文本框组件并公开. 二.列表数据类设计 1.定义一 ...

  7. 安卓自定义View——网易颜色渐变效果指示器

    一直想写博客来着,可惜直到现在才真正抽出时间.最近一直在研究网易新闻这个UI框架,发现了一些很值得借鉴的效果,当然,网上也不乏这方面的介绍.本文主要实现的指示器效果为字体颜色和大小渐变,废话不多说献上 ...

  8. android 自定义 snackbar,自定义Toast以及玩转SnackBar

    原标题:自定义Toast以及玩转SnackBar 有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~ 前言 今天我们来学习下有关 ...

  9. Android 自定义Toast实现多次触发只会显示一次toast

    #使用场景描述 当我们处于某个场景,例如一个按钮可以触发toast的显示,当你在多次点击按钮时,会多次触发toast的显示.而调用android原生的toast的makeText的方式所生产的toas ...

  10. react封装一个类似安卓的toast控件message

    项目中经常会用到类似安卓的toast的控件.封装一个这样的组件是每个项目必须的事情. import React from 'react'; import ReactDOM from 'react-do ...

最新文章

  1. Qt 编码问题QTextCodec
  2. 当深度学习遇上图: 图神经网络的兴起!
  3. 推荐系统(7):推荐算法之基于协同过滤推荐算法
  4. 当面试官说 “你还有什么问题想问的” ,你该如何回答?
  5. keystore java_Java KeyStore getEntry()用法及代码示例
  6. django oscar_赢得奥斯卡奖之后会发生什么
  7. 耐摔 8寸 android,屏幕耐摔的手机有哪些?6款屏幕耐摔的手机推荐
  8. Java框架学习笔记--Mybatis学习
  9. 【vscode插件集】学前端一年,珍藏的 40个 vscode 插件
  10. 【R1CS to QAP】
  11. MiKTeX + Texmaker 组合下使.tex文件支持中文的设置方法
  12. 计算机网络中 数据交换的方式有,计算机网络中的通信数据交换技术探讨
  13. POM文件配置详解(总体与单项)
  14. 微信小程序中实现获奖名单滚动播放
  15. 在Linux中修改系统的IP地址
  16. 程序猿生存指南-60 一晌贪欢
  17. 一起做RGB-DSLAM(7)
  18. R语言统计—多重比较(1)
  19. 解决微信小程序使用wxcharts在屏幕不固定问题-开发工具里也显示好了布局,为啥到真机就是乱的...
  20. 【云计算学习笔记(十六)】之 KVM原理,Libvirt,VLAN,Linux Bridge介绍

热门文章

  1. 激光雷达的障碍物检测
  2. 浅谈JPA一:JPA是什么?
  3. 快速集成华为AGC-AppLinking服务-Cocos平台
  4. android远程桌面闪退,win7系统连接远程桌面出现闪退问题的两种解决方法详细教程...
  5. 索尼rx1r人脸识别_徕卡Q2 索尼rx1r2对比
  6. C#|图像快速傅立叶变换与反变换
  7. Html代码问题:用鼠标悬停在文字上文字的颜色就变颜色的效果
  8. bootice安装grub2-00 到硬盘或者U盘mbr
  9. 三相电压型PWM整流器设计
  10. 使用Swagger生成 API 文档(go语言示例)