ToastCustom【自定义显示风格的Toast】

版权声明:本文为博主原创文章,未经博主允许不得转载。

前言

基于系统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);
    }
}

ToastCustom.java

将toast_custom_view.xml文件复制到项目中

<?xml version="1.0" encoding="utf-8"?>
<!-- 自定义显示风格的Toast的布局文件 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_custom_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/toast_custom_view_bg"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_toast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/toast_custom_text_paddingTB"
        android:paddingBottom="@dimen/toast_custom_text_paddingTB"
        android:paddingLeft="@dimen/toast_custom_text_paddingLR"
        android:paddingRight="@dimen/toast_custom_text_paddingLR"
        android:text=""
        android:textColor="@android:color/white"
        android:textSize="@dimen/toast_custom_text_size"/>

</LinearLayout>

toast_custom_view.xml

将toast_custom_view_bg.xml文件复制到项目中

<?xml version="1.0" encoding="utf-8"?>
<!-- 自定义显示风格的Toast的布局文件的背景 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <!-- 圆角 -->
    <corners android:radius="@dimen/toast_custom_view_bg_corners" />
    <!-- 描边 -->
    <stroke
        android:width="1dp"
        android:color="#666666" />
    <!-- 填充 -->
    <solid android:color="#666666" />

</shape>

toast_custom_view_bg.xml

在dimens.xml中添加以下颜色标记的代码

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>

    <!-- **************自定义显示风格的Toast布局文件********************* -->
    <!-- 提示文字的大小 -->
    <dimen name="toast_custom_text_size">18sp</dimen>
    <!-- 提示文字的内边距(上下) -->
    <dimen name="toast_custom_text_paddingTB">10dp</dimen>
    <!-- 提示文字的内边距(左右) -->
    <dimen name="toast_custom_text_paddingLR">20dp</dimen>
    <!-- 背景的圆角 -->
    <dimen name="toast_custom_view_bg_corners">30dp</dimen>
</resources>

三、使用方法

ToastCustom toastCustom = ToastCustom.makeText(this,"自定义Toast显示风格",Toast.LENGTH_LONG);
toastCustom.show();

如果想要修改文本或者显示位置,参考下面的代码:

ToastCustom toastCustom = ToastCustom.makeText(this,"自定义Toast显示风格",Toast.LENGTH_LONG);
toastCustom.setText(R.string.app_name);
toastCustom.setGravity(Gravity.CENTER,0,0);
toastCustom.show();

混淆配置

参考资料

android 自定义Toast显示风格

http://blog.csdn.net/yongxinzhenxi/article/details/25069415

Android:谈一谈安卓应用中的Toast情节(基础)

http://www.cnblogs.com/net168/p/4041763.html

Android:剖析源码,随心所欲控制Toast显示

http://www.cnblogs.com/net168/p/4058193.html

项目demo下载地址

链接:http://pan.baidu.com/s/1i4Q5pYH 密码:8cya

时间: 2024-11-06 16:38:31

ToastCustom【自定义显示风格的Toast】的相关文章

Toast拓展--自定义显示时间和动画

Toast拓展–自定义显示时间和动画 我们在Android应用开发中经常会需要在界面上弹出一个对界面操作无影响的小提示框来提示用户一些信息,这时候一般都会使用Android原生的Toast类 Toast.makeText(mContext, "消息内容", Toast.LENGTH_SHORT).show(); 一开始觉得,挺好用的,就有点什么消息都用Toast显示了. 但是用久了就发现,Toast的显示和消失动画不符合自己的要求,显示时间也只有SHORT和LONG两种选择,好像不太够

PowerDesigner 创建概念模型、转换显示风格、概念模型转逻辑模型

1.创建逻辑模型 2.配置实体间关系 3.修改显示风格 可以在Tools->Model Option里修改Model的Notation,去改变实体关系图显示的风格. 比如我们比较常用的,Entity/Relationship, 显示如下: 4.概念模型转逻辑模型 点击Tools->Generate Logical Model,自动生成逻辑模型,由于逻辑模型会消除M:N的关系,因此会自动建表,如下 5.0:1.1:1关系 1:N,M:N关系的表一般叫Assoication Table 0:1,1

完全自定义窗体风格的实现

完全自定义窗体风格的实现 最小化到任务栏postmessage(Self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); 最大化或还原procedure Tf_MainForm.RzToolButton1Click(Sender: TObject);var  abd: TAppBarData;begin  inherited;  if WindowState=wsnormal then begin    WindowState := wsMaximized;  // B

Siteserver-stl:searchOutput(搜索结果)自定义显示样式

stl:searchOutput 自定义显示样式 自定义搜索提交表单需要在<stl:searchOutput>中嵌入显示搜索结果的标签,必须包含的标签 有<stl:pageContents>和<stl:pageitems>及<stl:pageItem>元素,分 别用于显示搜索结果分页列表和搜索结果翻页项. 注意: <stl:searchOutput>内必须包含一个<stl:pageContents>元素,用于显示搜索结果内容列表,详情

LR脚本自定义显示Controller虚拟用户状态

在场景监控的过程中,想知道场景运行时Vusers的运行状态以及每一个Vuser虚拟用户在本次场景运行的过程共迭代了多少次,那么就需要在VuGen脚本中自定义显示虚拟用户状态信息. 代码如下: static int iteration; Action_userStatus() { //在VuGen脚本中显示参数值,参数化名为param lr_output_message("当前参数:%s",lr_eval_string("{parameter}")); //这里设置一

自定义显示多行 Spinner

自定义变量如下: private Context mContext; private LayoutInflater mInflater; private PopupWindow mPopupWindow; private ListView mListView; private CustomSpinnerAdapter mAdapter;//下拉适配器 private OnSpinnerItemSelectedListener mListener;//自定义选中回调接口 private List<

SharePoint 2013 关于自定义显示列表表单的bug

1.在SharePoint 2013中,我们隐藏列表Dispform页面的ListFormWebPart部件,转而使用自定义显示列表表单进行展示,因为这样更容易定制我们需要的显示: 2.之后发现文件夹下的文档,查看属性会报错,如下图: 3.报错如下图,没有项目: 4.不在文件夹下的项目,就没有这样的问题,怀疑是获取CurrentItem出问题了,但是没想到怎么去改xslt,如下图: 5.百度谷歌查找解决方案,最后找到定义列表模板,参考jianyi的博客,如下图: 6.然后发现处在文件夹下的ID为

[01]可拖动、可调节大小、自定义按钮风格的无边框WPF程序

初学WPF,用VS2012写了一个可拖动.可调节大小.自定义按钮风格的无边框程序.效果如下: 实现过程:一.拖动.调节大小.无边框主要参考了: http://blog.csdn.net/dlangu0393/article/details/12548731 二.自己主要完成自定义按钮效果. 1.  WPF定义按钮风格方法 (1) 添加一个Resource Dictionary文件,如Style.xaml.例如: <ResourceDictionary xmlns="http://schem

jquery ui autocomplete ajax返回数据自定义显示

1.body里面的内容 <input type="text" class="inputTxt" id="txtJigou" autocomplete="off"/> 2.引入jquery.ui.min.js和他的样式 3.js代码如下<script type="text/javascript"> $(function(){ $("#txtJigou").autoc