热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

分享Android中Toast的自定义使用

Android中的Toast是一种简易的消息提示框,toast提示框不能被用户点击,toast会根据用户设置的显示时间后自动消失。本文将介绍Toast的自定义使用,下面一起来看看吧。

1.Toast源码分析

老规矩,我们先去看Toast的源码。

Toast有两种显示布局方式,一种最常见调用Toast.makeText()  ,看源码是这样写的

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);

LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);

result.mNextView = v;
result.mDuration = duration;

return result;
}

transient_notification这个布局文件代码是这样的





那么我们想要修改Toast的文字消息样式,其实就是修改Toast根布局和message这个TextView。

Toast的另外一种显示模式就是自定义布局显示。这个方法不调用Toast.makeText()方法,而是new一个Toast对象,然后调用setView()方法。当然自定义布局就不会加载transient_notification布局了。

2.实现自定义Toast

先给大家看下我封装的工具类ToastUtil。

import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by 赵晨璞 on 2016/8/11.
 */
public class ToastUtil {

private Toast toast;
private LinearLayout toastView;

/**
 * 修改原布局的Toast
 */
public ToastUtil() {

}

/**
 * 完全自定义布局Toast
 * @param context
 * @param view
 */
public ToastUtil(Context context, View view,int duration){
  toast=new Toast(context);
  toast.setView(view);
  toast.setDuration(duration);
}

/**
 * 向Toast中添加自定义view
 * @param view
 * @param postion
 * @return
 */
public ToastUtil addView(View view,int postion) {
  toastView = (LinearLayout) toast.getView();
  toastView.addView(view, postion);

  return this;
}

/**
 * 设置Toast字体及背景颜色
 * @param messageColor
 * @param backgroundColor
 * @return
 */
public ToastUtil setToastColor(int messageColor, int backgroundColor) {
  View view = toast.getView();
  if(view!=null){
    TextView message=((TextView) view.findViewById(android.R.id.message));
    message.setBackgroundColor(backgroundColor);
    message.setTextColor(messageColor);
  }
  return this;
}

/**
 * 设置Toast字体及背景
 * @param messageColor
 * @param background
 * @return
 */
public ToastUtil setToastBackground(int messageColor, int background) {
  View view = toast.getView();
  if(view!=null){
    TextView message=((TextView) view.findViewById(android.R.id.message));
    message.setBackgroundResource(background);
    message.setTextColor(messageColor);
  }
  return this;
}

/**
 * 短时间显示Toast
 */
public ToastUtil Short(Context context, CharSequence message){
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_SHORT);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_SHORT);
  }
  return this;
}

/**
 * 短时间显示Toast
 */
public ToastUtil Short(Context context, int message) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_SHORT);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_SHORT);
  }
 return this;
}

/**
 * 长时间显示Toast
 */
public ToastUtil Long(Context context, CharSequence message){
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_LONG);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_LONG);
  }
  return this;
}

/**
 * 长时间显示Toast
 *
 * @param context
 * @param message
 */
public ToastUtil Long(Context context, int message) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_LONG);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_LONG);
  }
  return this;
}

/**
 * 自定义显示Toast时间
 *
 * @param context
 * @param message
 * @param duration
 */
public ToastUtil Indefinite(Context context, CharSequence message, int duration) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message,duration);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(duration);
  }
   return this;
}

/**
 * 自定义显示Toast时间
 *
 * @param context
 * @param message
 * @param duration
 */
public ToastUtil Indefinite(Context context, int message, int duration) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message,duration);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(duration);
  }
  return this;
}

/**
 * 显示Toast
 * @return
 */
public ToastUtil show (){
  toast.show();

  return this;
}

/**
 * 获取Toast
 * @return
 */
public Toast getToast(){
  return toast;
}
}

修改Toast背景色的使用法方法如下:

ToastUtil toastUtil=new ToastUtil();
toastUtil.Short(MainActivity.this,"自定义message字体、背景色").setToastColor(Color.WHITE, getResources().getColor(R.color.colorAccent)).show();


修改Toast背景色

方形的Toast看上去有些呆板,我自定义了一个名为toast_radius.xml的背景,代码如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;>







然后上面设置背景的代码改成:

toastUtil.Short(MainActivity.this,"自定义message字体颜色和背景").setToastBackground(Color.WHITE,R.drawable.toast_radius).show();


修改了背景的Toast

虽然官方认为Toast和Snackbar都应该是短文本的形式,不能包含图标,但是个人感觉加上图标还是挺好玩的...

向Toast中添加图标可以这样:

 ImageView toastImage = new ImageView(getApplicationContext());
 toastImage.setImageResource(R.mipmap.ic_launcher);
 toastUtil.Short(MainActivity.this,"向Toast添加了一个ImageView").setToastBackground(Color.WHITE,R.drawable.toast_radius).addView(toastImage,0).show();


添加图标的Toast

如果你想要Toast显示自定义的布局,可以这样:

 View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.image,null);
 new ToastUtil(MainActivity.this,view,Toast.LENGTH_SHORT).show();


自定义布局Toast,我的布局文件中只有一个默认图标的ImageView

大家都知道,连续触发Toast的show()方法的时候,Toast就会排着队连续展示,感觉上不太友好。所以我先判断了toast是否没被创建或者是否被添加了额外的view,如果是的话就重新生成一个toast对象;如果否的话就只修改message文字和显示时间。


Toast布局修改,不排队显示

总结

我这个工具类不是完全体,大家再根据自己项目的具体需求进行修改。以上就是Android中Toast的花式使用的全部内容,感兴趣的小伙伴们快快自己动手实践起来吧。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
author-avatar
你看看我的世界_420
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有