Android自己定义Toast

今天在写PDA的时候用到了自己定义的Toast比較经典于是记录一下

首先看一下android的Toast的源代码发现:

  /**
     * Make a standard toast that just contains a text view.
     *
     * @param context  The context to use.  Usually your {@link android.app.Application}
     *                 or {@link android.app.Activity} object.
     * @param text     The text to show.  Can be formatted text.
     * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
     *                 {@link #LENGTH_LONG}
     *
     */
    public static Toast makeText(Context context, CharSequence text, 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;
    }

凝视写着不过个包括了一个TextView的Toast

不难发现这个Toast用了一个系统自带的layout去展示Toast的布局,然后用了result.mNextView 跟 result.mDuration把Toast跟传递的參数和显示的布局聚合起来,知道了原理我们就能够自己定义Toast了

1,首先我们要自定一个布局来显示我们想要Toast显示的效果

2,通过传递參数跟我们自己定义布局里面的组件进行交互

3,通过setView把我们的布局跟我们的Toast联系起来

<span style="font-size:18px;"><?

xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/toast_shape"
    >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center"
        >
        <ImageView
            android:id="@+id/iv_hint_icon"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:src="@drawable/pda_failure_icon"
            android:layout_marginLeft="5dp"
            />
        <TextView
            android:id="@+id/tv_hint_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textSize="28sp"
            android:textColor="#eb4e4e"
            android:layout_marginLeft="5dp"
            android:text="上架失败 !"
            android:layout_toRightOf="@+id/iv_hint_icon"
            />
        <TextView
            android:id="@+id/tv_check_add_info"
            android:layout_below="@+id/tv_hint_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textSize="22sp"
            android:textColor="#eb4e4e"
            android:layout_marginTop="20dp"
            android:layout_marginLeft="5dp"
            android:text="请细致核对上架信息!"
            />
    </RelativeLayout>
</LinearLayout></span>

接下来是定义的shape代码

<span style="font-size:18px;"><?

xml version="1.0" encoding="utf-8"?

>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp" />
    <solid android:color="#ffffff" />
    <stroke android:color="#000000" android:width="2dp"/>
    <padding android:bottom="30dp" android:left="30dp" android:right="30dp" android:top="30dp" />

</shape></span>

自己定义Toast代码

public class PDAToast extends Toast{

    /**
     * Construct an empty Toast object.  You must call {@link #setView} before you
     * can call {@link #show}.
     *
     * @param context The context to use.  Usually your {@link Application}
     *                or {@link Activity} object.
     */
    public PDAToast(Context context) {
        super(context);
    }

    public static Toast makeText(Context context,int imgId,CharSequence hintText,boolean showFailure,int duration){
        Toast mToast = new Toast(context);
        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = mInflater.inflate(R.layout.pda_toast_layout,null);//TODO 设置对话框的布局
        ImageView hint_icon = (ImageView) layout.findViewById(R.id.iv_hint_icon);
        hint_icon.setImageResource(imgId);
        TextView hint = (TextView) layout.findViewById(R.id.tv_hint_text);
        hint.setText(hintText);
        TextView failure_desc = (TextView) layout.findViewById(R.id.tv_check_add_info);
        if(showFailure){
            failure_desc.setVisibility(View.VISIBLE);
        }else{
            failure_desc.setVisibility(View.GONE);
        }
        mToast.setView(layout);
        mToast.setGravity(Gravity.CENTER,0,0);
        mToast.setDuration(duration);
        return mToast;
    }
}

上面有一句话要注意:

Construct an empty Toast object.  You must call {@link #setView} before you
     * can call {@link #show}

提示构造一个空的Toast的话,在你show之前必须调用SetView否则会报错

 public static Toast makeText(Context context,int imgId,CharSequence hintText,boolean showFailure,int duration)
 參数解释:
context:上下文
imgId:显示图片资源
hintText:显示提示信息
showFailure:是否显示错误信息
duration:显示时长

调用Toast:

<span style="white-space:pre">	</span>     @Override
            public void onSuccess(BaseResponseData dataObj, String jsonString) {
                PDAToast.makeText(AddActivity.this,R.drawable.pda_success_icon,"上架成功 !",false,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(int resCode, String msg, String jsonString) {
                Log.e("TAG","result:"+resCode +" error desc :"+msg +" response data:"+jsonString);
                PDAToast.makeText(AddActivity.this,R.drawable.pda_failure_icon,"上架失败 !",true,Toast.LENGTH_SHORT).show();
            }

显示效果:

That‘s all

时间: 2024-12-28 01:30:04

Android自己定义Toast的相关文章

自己定义Toast

.指定Toast通知的位置 自己定义Toast: 怎样自己定义Toast?? 第一步: 写一个XML样式自己定义Toast显示样式 在res/layout下创建一个xml文件toast(文件名称自己定义) <?xml version="1.0" encoding="utf-8"? > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

46.Android 自己定义Dialog

46.Android 自己定义Dialog Android 自己定义Dialog 前言 提示Dialog 提示Dialog 效果图 菜单Dialog 菜单Dialog 效果图 DialogActivity 前言 提供两套自己定义Dialog模板 第一种.提示Dialog,有消失时间. 另外一种,菜单Dialog,用于用户交互. 提示Dialog CustomDialog public class CustomDialog extends Dialog { private TextView dia

Android自己定义组件系列【5】——进阶实践(2)

上一篇<Android自己定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一篇我们来看看ExpandableListView的使用并实现剩下的部分. 原文出处:http://blog.csdn.net/singwhatiwanna/article/details/25546871 一.ExpandableListView的使用方法 ExpandableListView是ListVi

【Js】调用Android WebView定义的方法总结

先贴代码: package com.example.demowebview; import Android.os.Bundle;import android.os.Handler;import android.app.Activity;import android.webkit.JAVAscriptInterface;import android.webkit.JsResult;import android.webkit.WebChromeClient;import android.webkit

android 永不关闭toast

Toast信息提示框之所以在显示一定时间后会自动关闭,是因为在系统中有一个Toast队列;那么有些时候需要这个Toast信息提示框长时间显示,直到需要关闭它时通过代码来控制,而不是让系统自动来关闭Toast信息提示框 Toast信息提示框之所以在显示一定时间后会自动关闭,是因为在系统中有一个Toast队列.系统会依次从队列中取(出队列)一个Toast,并显示它.在显示一段时间后,再关闭,然后再显示下一个Toast信息提示框.直到Toast队列中所有Toast都显示完为止.那么有些时候需要这个To

Android UI-自定义日历控件

Android UI-自定义日历控件 本篇博客笔者给大家分享一个日历控件,这里有个需求:要求显示当前月的日期,左右可以切换月份来查看日期. 我们想一想会如何去实现这样的一个控件,有开源的,但可能不太满足我们的特定的需求,这里笔者自定义了一个,读者可以根据自己的需求来修改代码.下面来说一下实现的思路: 首先我们要显示当前月份,自然我们要计算出当前的日期,并且把每一天对应到具体的星期,我们会有以下效果: 我们先想一下这样的效果用什么控件可以实现?很自然可以想到用网格视图GridView,但这里笔者使

ANDROID自己定义视图——onLayout源代码 流程 思路具体解释

简单介绍: 在自己定义view的时候.事实上非常easy.仅仅须要知道3步骤: 1.測量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():怎样绘制这个View. 而第3步的onDraw系统已经封装的非常好了,基本不用我们来担心,仅仅须要专注到1,2两个步骤就中好了. 第一步的測量,能够參考我之前的文章:(ANDROID自己定义视图--onMeasure流程.MeasureSpec具体解释) 而

Android自己定义控件皮肤

Android自己定义控件皮肤 对于Android的自带控件,其外观仅仅能说中规中矩,而我们平时所示Android应用中,一个简单的button都做得十分美观.甚至于很多button在按下时的外观都有一定变化,用户体验十分好. 这当中,就涉及到了Android自己定义控件属性的操作方法,下面操作以实现自己定义button皮肤为例. 1. 我们要自己定义将要实现的外观状态.能够是图片或者是自己定义的xml,这是我们直接自己定义不同状态的颜色xml,在values文件夹下新建colors.xml,代

android 自己定义控件属性(TypedArray以及attrs解释)

近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这个学习,讲一下流程吧,兴许一篇还有应用. 1.attrs文件编写 <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="titleText" for