在实际开发中Toast使用频率非常高,但是,自定义Toast个人感觉使用不是很高,下面我们来看一Toast是如何实现View 的,我们如果自定义Toast。
Toast 源码
我们这里不进行Toast的全部源码分析,只对我们自定义会用到的部分源码进行分析。
变量
-
View mNextView
这个变量是显示的View
-
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();
网友评论