分享Android中Toast的自定义使用

 更新时间:2016年08月17日 17:52:31   作者:简名  
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这个布局文件代码是这样的

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

相关文章

  • android避免弹出软键盘遮盖listview的简单方法

    android避免弹出软键盘遮盖listview的简单方法

    下面小编就为大家带来一篇android避免弹出软键盘遮盖listview的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • 详解如何从原生Android 跳转到hbuilder项目

    详解如何从原生Android 跳转到hbuilder项目

    这篇文章主要介绍了从原生Android 跳转到hbuilder项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Android SharedPreferences实现数据存储功能

    Android SharedPreferences实现数据存储功能

    这篇文章主要为大家详细介绍了Android SharedPreferences实现数据存储功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android自定义view实现水波纹进度球效果

    Android自定义view实现水波纹进度球效果

    在我们的日常开发中自定义控件还是用的挺多的,设计师或者产品为了更好的漂亮,美观,交互都会做一些牛逼的ui效果图,但是最后实现的还是我们程序员啊。所以说 自定义view你还是得会的。
    2016-08-08
  • Android仿新浪微博、QQ空间等帖子显示(2)

    Android仿新浪微博、QQ空间等帖子显示(2)

    这篇文章主要为大家详细介绍了Android仿新浪微博、QQ空间等帖子显示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android编程实现滑动按钮功能详解

    Android编程实现滑动按钮功能详解

    这篇文章主要介绍了Android编程实现滑动按钮功能,结合实例形式较为详细的分析了Android实现滑动按钮的功能、布局及相关注意事项,需要的朋友可以参考下
    2017-02-02
  • Android中WebView的一些简单用法

    Android中WebView的一些简单用法

    这篇文章主要介绍了Android中WebView的一些简单用法,WebView非常简单,Android已经封装的非常完善,写个小例子覆盖其间常用的几个方法;
    2016-08-08
  • Android自定义popupwindow实例代码

    Android自定义popupwindow实例代码

    这篇文章主要为大家详细介绍了Android自定义popupwindow实例代码,popupwindow弹出菜单效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android中SoundPool的使用步骤实例

    Android中SoundPool的使用步骤实例

    今天小编就为大家分享一篇关于Android中SoundPool的使用步骤实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Android Volley扩展实现支持进度条的文件上传功能

    Android Volley扩展实现支持进度条的文件上传功能

    这篇文章主要为大家详细介绍了Android Volley扩展实现文件上传与下载功能,支持进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12

最新评论