标题有点拗口,其实是可以分别写成两篇博文的。也就是说看完这篇能了解两个方面:
自定义布局样式的Toast
自定义PopupWindow实现多功能Toast
先感性认识:
触发事件来自于MenuItem的onClick,具体请看上一篇Android 自定义Menu
一 、自定义布局样式的Toast
布局文件dialog_toast.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
RelativeLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
>
<
TextView
android:id
=
"@+id/dialog_title"
android:textSize
=
"@dimen/dialog_toast_title_text_size"
android:layout_width
=
"@dimen/dialog_toast_width"
android:layout_height
=
"wrap_content"
android:gravity
=
"center_horizontal"
android:text
=
"@string/toast_dialog_title"
/>
<
TextView
android:id
=
"@+id/dialog_content"
android:layout_width
=
"@dimen/dialog_toast_width"
android:layout_height
=
"wrap_content"
android:drawableLeft
=
"@drawable/frog"
android:drawableRight
=
"@drawable/fungus"
android:layout_below
=
"@id/dialog_title"
android:text
=
"@string/toast_dialog_content"
/>
</
RelativeLayout
>
|
使用这个自定义布局,解决多次Toast重复弹出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/**
* 显示自定义Toast<p>
* private Toast mToast;<br/>
* View toastView = mLayoutInflater.inflate(R.layout.dialog_toast, null);
* @param toastView
*/
private
void
showToast(View toastView) {
toastView.setBackgroundColor(Color.TRANSPARENT);
if
(mToast ==
null
) {
mToast =
new
Toast(mContext);
mToast.setView(toastView);
mToast.setGravity(Gravity.BOTTOM|Gravity.CENTER,
0
,
100
);
mToast.setDuration(Toast.LENGTH_SHORT);
}
mToast.show();
}
|
二 、自定义PopupWindow实现多功能Toast
以下是MenuItem点击事件的完整代码,详细注释了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
@Override
public
void
onClick(View v) {
/** MenuItem dismiss */
mPopWindow.dismiss();
/**
* 自定义PopupWindow模拟多功能Toast
*/
View popToastView = mLayoutInflater.inflate(
R.layout.dialog_toast,
null
);
mPopToast =
new
PopupWindow(popToastView,
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
true
);
mPopToast.setBackgroundDrawable(
new
ColorDrawable(
Color.TRANSPARENT));
mPopWindow.setOutsideTouchable(
true
);
// 设置触摸外面时消失
mPopToast
.setAnimationStyle(android.R.style.Animation_Dialog);
// 设置动画效果
mPopToast.showAtLocation(v,
Gravity.BOTTOM | Gravity.CENTER,
0
,
300
);
/**
* 用PopupWindow模拟Toast,里面的TextView的点击事件。
* 因为Toast不获取焦点,所以View的事件无法处理。
* 而PopupWindow解决了这个焦点问题。
*/
TextView dialogContent = (TextView) popToastView
.findViewById(R.id.dialog_content);
dialogContent.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
if
(mPopToast !=
null
&& mPopToast.isShowing()) {
mPopToast.dismiss();
/** 再次显示自定义Toast, 这次是从PopupWindow里面的TextView触发的 */
View toastViewAgain = mLayoutInflater.inflate(
R.layout.dialog_toast,
null
);
showToast(toastViewAgain);
}
}
});
/** 显示自定义Toast */
View toastView = mLayoutInflater.inflate(
R.layout.dialog_toast,
null
);
showToast(toastView);
}
|
使用PopupWindow实现的Toast可以不受Toast.LENGTH_SHORT或Toast.LENGTH_LONG的时间限制,并且可以得到焦点和用户交互,比如onClick等等。
Toast本身是一个非常便捷的提示组件,它的特点就是使用便捷,比如
1
|
Toast.makeText(mContext,
"123"
, Toast.LENGTH_SHORT).show();
|
这样的一句代码就可以给出用户一个很友好的提示。
如果想做出复杂的交互功能,这些就不是Toast的定位了,需要自定义PopupWindow或者AlertDialog来实现,它们的定位在此。
本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/1216906,如需转载请自行联系原作者