Android Toast 吐司
Android Toast
( 吐司 ) 一般用于提示信息的,是一种很方便的消息提示框,会在屏幕中显示一个消息提示框,没任何按钮,也不会获得焦点一段时间过后自动消失
Toast
会浮在所有的窗口之上,位于屏幕的下方居中的位置,而且不会识别任何手势,比如单击动作等
Toast
Toast
是为数不多的没有 XML 创建代码的 UI 控件
常量
Toast
定义了两个常量,分别表示显示多长时间后消失
常量 | 说明 |
---|---|
LENGTH_LONG | 显示比较长时间 |
LENGTH_LONG | 显示比较短时间 |
不过我们可以通过 Toast.setDuration(int duration)
自己定义时常
方法
方法 | 说明 |
---|---|
void cancel() | 如果 Toast 已经显示,则关闭 Toast, 如果 Toast 还未显示,则取消显示 |
void show() | 显示指定持续时间的视图 |
int getDuration() | 返回持续时间 |
int getGravity() | 获取 Toast 应显示在屏幕上的位置 |
float getHorizontalMargin() | 返回水平边距 |
float getVerticalMargin() | 返回垂直边距 |
View getView() | 返回 Toast 的 View |
int getXOffset() | 以 px 为单位返回 X 偏移量 |
int getYOffset() | 以 px 为单位返回 Y 偏移量 |
static Toast makeText(Context context, int resId, int duration) | 创建 Toast 用于显示给定的资源 |
static Toast makeText(Context context, CharSequence text, int duration) | 创建 Toast 用于显示给定的文本 |
void setDuration(int duration) | 设置 Toast 的显示时间 |
void setGravity(int gravity, int xOffset, int yOffset) | 设置 Toast 在屏幕上显示的位置 |
void setMargin(float horizontalMargin, float verticalMargin) | 设置视图的边距 |
void setText(int resId) | 用一个资源更新 Toast 要显示的文本或资源 |
void setText(CharSequence s) | 用一段文本更新 Toast 要显示的文本或资源 |
void setView(View view) | 设置要显示的视图 |
介绍了这么多方法,现在我们就使用两种方式来创建一个 Toast
Toast.makeText()
这是我们创建 Toast
用的最多的方式
Toast.makeText(MainActivity.this, "提示的内容", Toast.LENGTH_LONG).show();
现在我们就来演示下吧,真的很简单啦
-
创建一个 空的 Android 项目
cn.twle.android.Toast
-
修改
MainActivity.java
package cn.twle.android.toast; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(MainActivity.this, "我是 Toast 啦", Toast.LENGTH_LONG).show(); } }
定制 Toast 的文本颜色和背景颜色
我们可以通过 Toast.getView()
方法获得 Toast 的视图,这是一个 TextView
,然后就可以修改它的字体颜色和背景颜色
还可以通过 Toast.setGravity()
方法设置 Toast
显示的位置
现在我们就利用这些方法创建一个警告框
-
复用上面的 demo
-
修改
MainActivity.java
package cn.twle.android.toast; import android.support.v7.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast toast = Toast.makeText(MainActivity.this, "我是 Toast 啦", Toast.LENGTH_LONG); // 设置显示位置 toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL , 0, 0); // 获取 TextView 视图 TextView v = (TextView) toast.getView().findViewById(android.R.id.message); // 设置 TextView 字体颜色 v.setTextColor(Color.YELLOW); toast.show(); } }
封装
因为定制 Toast
的需求很常见,所以我们一般会把他们封装成一个方法
void warnHint(String str, int showTime) { Toast toast = Toast.makeText(getApplicationContext(), str, showTime); //设置显示位置 toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL , 0, 0); TextView v = (TextView) toast.getView().findViewById(android.R.id.message); // 设置 TextView 字体颜色 v.setTextColor(Color.RED); toast.show(); }
定制 Toast 的视图
我们可以使用 getView()
获取 Toast
的视图 ( view ) ,然后给视图添加其它 UI 控件
现在我们就给 Toast
添加一个小图标
-
复用上面的 demo
-
下载 /static/i/android/warn_red.png 并拖到
res/drawable
目录下 -
修改
MainActivity.java
package cn.twle.android.toast; import android.support.v7.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.widget.TextView; import android.widget.LinearLayout; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast toast = Toast.makeText(MainActivity.this, "我是 Toast 啦", Toast.LENGTH_LONG); // 设置显示位置 toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL , 0, 0); LinearLayout layout = (LinearLayout) toast.getView(); // 设置背景色为红色 layout.setBackgroundColor(Color.RED); // 获取 TextView 视图 TextView v = (TextView) layout.findViewById(android.R.id.message); // 设置 TextView 字体颜色 v.setTextColor(Color.WHITE); ImageView image = new ImageView(this); image.setImageResource(R.drawable.warn_red); layout.addView(image, 0); toast.show(); } }
Toast 完全自定义
上面这种自定义方式,巨丑无比,而且可能还不能完全满足我们的需求,要不我们就把整个 UI 重新定义一次好了
这次我们定义一个圆角带图片的 Toast
-
复用上面的 demo
-
创建圆角背景,在
res/drawable
目录下新建文件toast_bg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 设置透明背景色 --> <solid android:color="#BADB66" /> <!-- 设置一个黑色边框 --> <stroke android:width="1px" android:color="#FFFFFF" /> <!-- 设置四个圆角的半径 --> <corners android:bottomLeftRadius="10px" android:bottomRightRadius="10px" android:topLeftRadius="10px" android:topRightRadius="10px" /> <!-- 设置一下边距,让空间大一点 --> <padding android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp" /> </shape>
-
创建 Toast 的布局,在
res/layout
目录下新建文件toast_view.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/custom_toast" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/toast_bg" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/message" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" /> <ImageView android:id="@+id/icon" android:layout_width="16dp" android:layout_height="16dp" android:layout_marginLeft="10dp" android:src="@drawable/warn_red" /> </LinearLayout>
-
修改
MainActivity.java
package cn.twle.android.toast; import android.support.v7.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.LayoutInflater; import android.widget.TextView; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(R.layout.toast_view, (ViewGroup) findViewById(R.id.custom_toast)); ImageView icon = (ImageView) view.findViewById(R.id.icon); TextView message = (TextView) view.findViewById(R.id.message); message.setText("我是 Toast 啦"); Toast toast = new Toast(MainActivity.this); toast.setGravity(Gravity.CENTER, 0, 0); toast.setDuration( Toast.LENGTH_LONG ); toast.setView(view); toast.show(); } }