版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
基于系统Toast的自定义显示风格的Toast。
效果图
代码分析
- ToastCustom类基于系统Toast,不是继承Toast,只是通过toast.setView(view)方法引用自定义的显示风格布局文件,达到自定义显示风格的目的。
- 为了和Toast用法保持一致,ToastCustom类中也使用了makeText、show、setGravity、setText方法。方便在项目中直接替换Toast。
- 下面分析下ToastCustom类中的setText()方法
该方法用来修改显示的文本,刚开始的时候,我直接使用了toast.setText()方法进行修改文本:
public void setText(CharSequence s){ toast.setText(s); }
但是程序崩溃了。分析原因得知toast的setText方法是找到系统Toast的系统布局文件mNextView中的ID值为message的TextView控件,然后修改这个TextView控件的文本实现的。(下面是源码)
/** * Update the text in a Toast that was previously created using one of the makeText() methods. * @param s The new text for the Toast. */ public void setText(CharSequence s) { if (mNextView == null) { throw new RuntimeException("This Toast was not created with Toast.makeText()"); } TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message); if (tv == null) { throw new RuntimeException("This Toast was not created with Toast.makeText()"); } tv.setText(s); }
但是在ToastCustom类中我们已经修改了toast的布局文件引用,所以直接使用toast.setText()方法的时候,肯定找不到ID值为message的TextView控件。正确的代码如下:
public void setText(CharSequence s){ TextView tv = (TextView) toast.getView().findViewById(R.id.tv_toast); tv.setText(s); }
使用步骤
一、项目组织结构图
注意事项:
1、 导入类文件后需要change包名以及重新import R文件路径
2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖
二、导入步骤
将ToastCustom复制到项目中,并重新import R文件
package com.why.project.toastcustom.views; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.why.project.toastcustom.R; /** * Create By HaiyuKing * Used 自定义Toast显示风格,基于系统Toast【可以控制显示样式、位置,不可以控制显示时间、动画,不可触发】 * 注意 Toast布局在源码中的布局是采用LinearLayout */ public class ToastCustom { private static ToastCustom toastCustom; private Toast toast; public static ToastCustom makeText(Context context, CharSequence text, int duration){ LayoutInflater inflate = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflate.inflate(R.layout.toast_custom_view, null); TextView tv = (TextView)view.findViewById(R.id.tv_toast); tv.setText(text); if (toastCustom == null) { toastCustom = new ToastCustom(); } toastCustom.toast = new Toast(context); toastCustom.toast.setView(view); toastCustom.toast.setDuration(duration); return toastCustom; } public static ToastCustom makeText(Context context, int resId, int duration){ return ToastCustom.makeText(context,context.getResources().getString(resId),duration); } public void show(){ toast.show(); } /** * 1、gravity是输入Toast需要显示的位置,例如CENTER_VERTICAL(垂直居中)、CENTER_HORIZONTAL(水平居中)、TOP(顶部)等等。 * 2、xOffset则是决定Toast在水平方向(x轴)的偏移量,偏移量单位为,大于0向右偏移,小于0向左偏移 * 3、yOffset决定Toast在垂直方向(y轴)的偏移量,大于0向下偏移,小于0向上偏移,想设大值也没关系,反正Toast不会跑出屏幕。*/ public void setGravity(int gravity, int xOffset, int yOffset) { toast.setGravity(gravity, xOffset, yOffset); } public void setText(CharSequence s){ TextView tv = (TextView) toast.getView().findViewById(R.id.tv_toast); tv.setText(s); } public void setText(int resId){ TextView tv = (TextView) toast.getView().findViewById(R.id.tv_toast); tv.setText(resId); } }