分享Android中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这个布局文件代码是这样的

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="?android:attr/toastFrameBackground">

<TextView
android:id="@android:id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.Toast"
android:textColor="@color/bright_foreground_dark"
android:shadowColor="#BB000000"
android:shadowRadius="2.75"
/>

</LinearLayout>

那么我们想要修改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的背景,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色 -->
<solid android:color="#ffc107" />

<!-- android:radius 弧形的半径 -->
<corners android:radius="20dip" />

</shape>

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

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的花式使用的全部内容,感兴趣的小伙伴们快快自己动手实践起来吧。

(0)

相关推荐

  • Android编程实现自定义toast示例

    本文实例讲述了Android编程实现自定义toast.分享给大家供大家参考,具体如下: 效果图: 代码: //自定义布局的toast customViewToast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast toast = Toast.makeText(ToastTest.this, "top", Toast.LENGTH_SHORT); /

  • 微信小程序 Toast自定义实例详解

    微信小程序 Toast自定义实例详解 实现类似于Android的Toast提示 index.js: var timer; var inputinfo = ""; var app = getApp() Page({ data: { animationData:"", showModalStatus:false }, onLoad: function () { }, showModal: function () { // 显示遮罩层 var animation = wx

  • android之自定义Toast使用方法

    Android系统默认的Toast十分简洁,使用也非常的简单.但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合. 使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的布局文件结构一致,在该布局文件中我们需设计我们Toast的布局,例如: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> &

  • android自定义toast(widget开发)示例

    1.Toast控件: 通过查看源代码,发现Toast里面实现的原理是通过服务Context.LAYOUT_INFLATER_SERVICE获取一个LayoutInflater布局管理器,从而获取一个View对象(TextView),设置内容将其显示 复制代码 代码如下: public static Toast makeText(Context context, CharSequence text, int duration) {        Toast result = new Toast(c

  • 微信小程序 自定义Toast实例代码

    微信小程序 自定义Toast实例代码 Toast样式可以根据需求自定义,本例中是圆形 <!--按钮--> <view class="btn" bindtap="btn_toast">自定义Toast</view> <!--以下为toast显示的内容 opacity为透明度--> <view class="toast_box" style="opacity:{{0.9}}"

  • 超简单实现Android自定义Toast示例(附源码)

    Bamboy的自定义Toast,(以下称作"BToast") 特点在于使用简单, 并且自带两种样式: 1)普通的文字样式: 2)带图标样式. 其中图标有√和×两种图标. BToast还有另外一个特点就是: 系统自带Toast采用的是队列的方式,当前Toast消失后,下一个Toast才能显示出来: 而BToast会把当前Toast顶掉, 直接显示最新的Toast. 那么,简单三步,我们现在就开始自定义一下吧! (一).Layout: 要自定义Toast, 首先我们需要一个XML布局. 但

  • 基于自定义Toast全面解析

    Toast一般用来显示一行文字,用法比较固定: Toast.makeText(Context context,String message,int duration); 但是有时候想用toast 来显示复杂的view甚至是带有图片的view时这时候就要用到自定义的Toast,自定义Toast主要用到一下几个方法如图: 1.setView()方法用来显示用户自定义的view. 2. setGravity()用来确定Toast显示的位置. 3.setDuration()用来设置Toast显示的时间长

  • Android 自定义 Toast 显示时间

    Android 自定义 Toast 显示时间 实现代码: package com.wm.realname.util; import android.content.Context; import android.os.Handler; import android.view.View; import android.widget.Toast; /** * Toast自定义显示时间 * 使用方法 * 1.先初始化类 MyToast myToast = new MyToast(this); * 2.

  • 分享Android中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) c

  • Android中shape的自定义艺术效果使用

    shape形状之意,可自定义各种形状,如背景椭圆,圆角等等 创建目录:drawable–右键–new–drawable resourse file–键入文件名my_shape–ok–修改selector标签为shape 1圆角 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android&quo

  • 分享Android中ExpandableListView控件使用教程

    本文采用一个Demo来展示Android中ExpandableListView控件的使用,如如何在组/子ListView中绑定数据源.直接上代码如下: 程序结构图: layout目录下的 main.xml 文件源码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android

  • 分享Android中pullToRefresh的使用心得

    pullToRefresh的导入 首先,点击new按钮 -> import Module 然后在 New Module界面选择已经在本地的含有源代码的pullToRefresh. 打开如下图所示的open Module Settings 按钮 点击app中的Dependencies 中右边框的"+"按钮,选择第三个 ,如下所示 选择Modules : pullToRefreshLibrary ,点击OK 然后在build.gradle(Module:app)或者你自己要写的那个a

  • 基于Android中Webview使用自定义的javascript进行回调的问题详解

    先说为什么需要讨论这个问题. 现在很多的手机应用,都可能会直接嵌入一个web页面.这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端:另一个是功能通用,不仅android可以用,ios也可以用,symbian也可以直接用. 那为什么现在很多手机应用并不做成web方式的呢?原因很多.一个是现阶段web方式展现能力相对较弱,如果对于应用的美观程度要求比较高,就无法使用web方式:一个是web方式速度相对较慢,用户体验会受一些影响:一个是现阶段流量还是相对宝贵

  • Android中的Button自定义点击效果实例代码

    方法一1.放在drawable下的selector.xml文件 复制代码 代码如下: <android="http://schemas.android.com/apk/res/Android"> android:drawable="@drawable/temp2" /> 2.布局文件main.xml 复制代码 代码如下: <http://schemas.android.com/apk/res/android"    android:

  • Android中menu使用详解

    Menu(菜单)是Android中一定会使用的模块,每个Android项目都会用到Menu来给用户起到选择和导航的作用,提升用户体验,下面通过本文给大家分享android 中menu使用,需要的朋友一起看看吧 很多activity界面中都存在一个菜单栏,就是点击右上角的一个按钮的时候会出现一个下拉列表差不多的东西,这个功能的实现其实只需要下面的两步,每一个activity都可以拥有自己独一无二的menu,具体的格式可以自己进行定义,详细的创建步骤如下 ①在res下的menu中创建file_men

  • Android 更改 Toast 的默认位置方法

    Android中Toast的默认位置在屏幕靠近底部的位置,这个默认位置有时候并不合适.比如页面上内容较少时,内容一般集中在屏幕上半部分,用户的注意力也集中在屏幕上半部分,默认位置的Toast用户可能没有注意到.还有可能是默认位置的Toast被用户的手挡住了.实践中感觉将Toast显示在屏幕的中部或中上部会比较好.如何修改Toast的默认位置呢?下面做一个简单的例子来演示一下. 先上截图: 布局文件activity_toast.xml代码如下: <?xml version="1.0"

  • Android中实现WebView和JavaScript的互相调用详解

    前言 很多复杂的UI界面,在Android中需要配合大量xml代码和java代码实现,而使用HTML5可以非常轻松的实现出来,而且具有很好的跨平台特性,让我们不必为了多个平台而重写代码,H5学习成本也较低,上手快.虽然从目前来说H5在Android系统中的速度可能还欠佳一些,但相信随着手机的性能不断的提高,这些问题都会被解决 使用H5开发Android的UI界面,最重要的就是如何实现Js代码和Java代码之间的互相调用了 在讲解之前,让我们先把项目跑起来 效果图: 准备好index.html文件

  • Android中制作自定义dialog对话框的实例分享

    自定义dialog基础版 很多时候,我们在使用android sdk提供的alerdialog的时候,会因为你的系统的不同而产生不同的效果,就好比如你刷的是MIUI的系统,弹出框都会在顶部显示!这里简单的介绍自定义弹出框的应用. 首先创建布局文件dialog: 代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.and

随机推荐