您的当前位置:首页正文

Toast 从源码到自定义

来源:华拓网

在实际开发中Toast使用频率非常高,但是,自定义Toast个人感觉使用不是很高,下面我们来看一Toast是如何实现View 的,我们如果自定义Toast。

Toast 源码

我们这里不进行Toast的全部源码分析,只对我们自定义会用到的部分源码进行分析。

变量

  1. View mNextView

这个变量是显示的View

  1. int mDuration

这个变量是显示时间

方法

下面我们来看一下,我们常用的方法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;
    }

首先,我们发现,这是一个 static 修饰的方法,在方法中 new 了一个Toast ,在该方法中加载了显示的View 并对 View 内容进行设置,最后,就是 result.mNextView = v; result.mDuration = duration; 这两行,把View 和 显示时间赋给这两个变量。

下面我们在看两个方法:

    /**
     * Set the view to show.
     * @see #getView
     */
    public void setView(View view) {
        mNextView = view;
    }

    public View getView() {
        return mNextView;
    }

    /**
     * Set how long to show the view for.
     * @see #LENGTH_SHORT
     * @see #LENGTH_LONG
     */
    public void setDuration(@Duration int duration) {
        mDuration = duration;
        mTN.mDuration = duration;
    }

    @Duration
    public int getDuration() {
        return mDuration;
    }
    

这两个方法不用详细解释,一个是设置和获取View,一个是设置和获取显示时间的。

我们在来看一下设置位置的方法

    /**
     * Set the location at which the notification should appear on the screen.
     * @see android.view.Gravity
     * @see #getGravity
     */
    public void setGravity(int gravity, int xOffset, int yOffset) {
        mTN.mGravity = gravity;
        mTN.mX = xOffset;
        mTN.mY = yOffset;
    }

最会看一下取消方法
cancel() ,使用这个方法,取消正在显示的toast。

自定义 toast

了解了这些,下面不看我想也会了,下面是我写的一个小例子,仅供参考,实际还要根据自己的需求进行自定义,又说回来了,很少有项目需要自定义Toast的。

Toast toast = new Toast(this);
//加载View
View toastView = LayoutInflater.from(this).inflate(R.layout.toast_view,null);
//获取View控件
TextView textView = (TextView) toastView.findViewById(R.id.toast_text);
ImageView imageView = (ImageView) toastView.findViewById(R.id.toast_iamge);
//设置View控件内容
textView.setText("hello good");
imageView.setImageResource(R.mipmap.idscovery_selected);
//设置Toast View
toast.setView(toastView);
//设置显示时间
toast.setDuration(Toast.LENGTH_SHORT);
//设置显示位置
toast.setGravity(Gravity.CENTER,0,0);
//显示
toast.show();