Toast的用法(可以设置显示时间,自定义布局的,线程中的Toast)

自定义的Toast类
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:id="@+id/button01_id"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示自定义toast" /> <Button
android:id="@+id/button02_id"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示可以控制显示时间的toast" /> <Button
android:id="@+id/button03_id"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示由代码创建的toast" /> <Button
android:id="@+id/button04_id"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在其他线程中的toast" />
</LinearLayout>
自定义toast的布局界面

toast.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toast_layout_id"
android:orientation="vertical"
android:padding="10dp"
android:layout_width="200dp"
android:layout_height="150dp"
android:background="#000000"> <ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/kale"/> <TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="toast"
android:textColor="#FFF"/> </LinearLayout>
myToast.java
package com.kale.toast; import android.content.Context;
import android.os.Handler;
import android.view.View;
import android.widget.Toast; /*
* Toast自定义显示时间
* 使用方法
* 1.先初始化类 MyToast myToast = new MyToast(this);
* 2.显示消息 myToast.setText("要显示的内容");//设置要显示的内容
* myToast.show(8000); //传入消息显示时间,单位毫秒,最少2000毫秒,并且只能是2000的倍数。
* 传入0时会一直显示,只有调用myToast.cancel();时才会取消。
* 3.取消消息显示 myToast.cancel();
* */ public class MyToast { private Context mContext = null;
private Toast mToast = null;
private Handler mHandler = null;
private int duration = 0;
private int currDuration = 0;
private final int DEFAULT=2000;
private Runnable mToastThread = new Runnable() { public void run() {
mToast.show();
mHandler.postDelayed(mToastThread, DEFAULT);// 每隔2秒显示一次
if (duration != 0) {
if (currDuration <= duration) {
currDuration += DEFAULT;
}
else {
cancel();
}
} }
}; public MyToast(Context context) {
mContext = context;
currDuration=DEFAULT;
mHandler = new Handler(mContext.getMainLooper());
mToast = Toast.makeText(mContext, "", Toast.LENGTH_LONG);
} public void setText(String text) {
mToast.setText(text);
} public void show(int duration) {
this.duration = duration;
mHandler.post(mToastThread);
} public void setGravity(int gravity, int xOffset, int yOffset){
mToast.setGravity(gravity, xOffset, yOffset);
} public void setDuration(int duration){
mToast.setDuration(duration);
} public void setView(View view){
mToast.setView(view);
} public void cancel( ) {
mHandler.removeCallbacks(mToastThread);// 先把显示线程删除
mToast.cancel();// 把最后一个线程的显示效果cancel掉,就一了百了了
currDuration = DEFAULT;
}
}
MainActivity.java
package com.kale.toast; import android.app.Activity;
import android.os.Bundle;
import android.os.Looper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { Button btn01,btn02,btn03,btn04; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); viewInit();
ButtonListener listener = new ButtonListener();
btn01.setOnClickListener(listener);
btn02.setOnClickListener(listener);
btn03.setOnClickListener(listener);
btn04.setOnClickListener(listener); } public class ButtonListener implements OnClickListener{ @Override
public void onClick(View v) {
// TODO 自动生成的方法存根
switch (v.getId()) {
case R.id.button01_id:
firstToast();
break;
case R.id.button02_id:
secondToast();
break;
case R.id.button03_id:
thirdToast();
break;
case R.id.button04_id:
otherToast();
default:
break;
}
} } public void firstToast() {
//获取LayoutInflater对象,该对象能把XML文件转换为与之一直的View对象
LayoutInflater inflater = getLayoutInflater();
//根据指定的布局文件创建一个具有层级关系的View对象
//第二个参数为View对象的根节点,即LinearLayout的ID
View layout = inflater.inflate(R.layout.toast,
(ViewGroup) findViewById(R.id.toast_layout_id)); //查找ImageView控件
//注意是在layout中查找
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.kale);
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("自定义Toast"); Toast toast = new Toast(getApplicationContext());
//设置Toast的显示位置,后两个参数是偏移量
toast.setGravity(Gravity.CENTER, 0, 100);
toast.setView(layout);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
} public void secondToast() {
View view = getLayoutInflater().inflate(R.layout.toast, null);
MyToast myToast = new MyToast(MainActivity.this);
myToast.setText("显示时间为8000毫秒");//设置要显示的内容
myToast.setView(view);
myToast.show(8000); //传入消息显示时间,单位毫秒,最少2000毫秒,并且只能是2000的倍数。
} public void thirdToast() {
ImageView image = new ImageView(getApplicationContext());
image.setImageResource(R.drawable.ic_launcher); LinearLayout ll = new LinearLayout(getApplicationContext());
ll.addView(image); Toast toast = new Toast(getApplicationContext());
toast.setView(ll);
toast.setDuration(0);
toast.show();
} public void otherToast() {
System.out.println("other");
new Thread(){
@Override
public void run() {
Looper.prepare();//先移除
Toast.makeText(getApplicationContext(),"在其他线程中的toast",Toast.LENGTH_SHORT).show();
Looper.loop();// 进入loop中的循环,查看消息队列
}
}.start(); } private void viewInit() {
btn01 = (Button)findViewById(R.id.button01_id);
btn02 = (Button)findViewById(R.id.button02_id);
btn03 = (Button)findViewById(R.id.button03_id);
btn04 = (Button)findViewById(R.id.button04_id);
}
}
源码下载:http://download.csdn.net/detail/shark0017/7654053
Toast的用法(可以设置显示时间,自定义布局的,线程中的Toast)的更多相关文章
- Android开发之在子线程中使用Toast
在子线程中使用Toast的时候,出现Force close. 错误提示:Can't create handler inside thread that has not called Looper.pr ...
- 如何在子线程中使用Toast和更新UI
因为没一个Looper处理消息循环,所以子线程中无法使用Toast 方法: Looper.prepare(); Toast.makeText(getActivity(),"刷到底啦" ...
- Android线程中使用Toast、dialog、loading
代码改变世界 Android线程中使用Toast.dialog.loading Loading: Thread t1 = new Thread(new Runnable() { @Override p ...
- Notification的基本用法以及使用RemoteView实现自定义布局
Notification的作用 Notification是一种全局效果的通知,在系统的通知栏中显示.既然作为通知,其基本作用有: 显示接收到短消息.即时信息等 显示客户端的推送(广告.优惠.新闻等) ...
- Android Studio 之 在活动中使用 Toast
•简介 Toast 是 Android 系统提供的一种非常好的提醒方式: 在程序中可以使用它将一些短小的信息通知给用户: 这些信息会在一段时间内自动消失,并且不会占用任何屏幕空间 •Toast.mak ...
- 【转】通知 Toast详细用法(显示view)
原文网址:http://www.pocketdigi.com/20100904/87.html 今天学习Android通知 Toast的用法,Toast在手机屏幕上向用户显示一条信息,一段时间后信息会 ...
- 2018.6.2 AndroidStudio项目中的问题:===== oast.LENGTH_LONG和Toast.LENGTH_SHORT分别对应多长时间
oast.LENGTH_LONG和Toast.LENGTH_SHORT分别对应多长时间 在Android源码中的NotificationManagerService.java这个类中定义了两个静态变量 ...
- java操作Redis缓存设置过期时间
关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间. 在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息 ...
- Ubuntu设置显示桌面快捷键
Ubuntu设置显示桌面快捷键 直接在系统设置中没有效果, 学习了:http://www.cnblogs.com/pluse/p/5286585.html 需要进行安装compizconfig,然后在 ...
随机推荐
- explain的使用
MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. mysql. row ************ ...
- ElastAlert告警
ElastAlert告警 https://blog.csdn.net/qq_38369069/article/details/80842432
- Linux 获取目录中最后一个文件的名字
find /application/docker_hub/logs/fof1private/amount_dev -type l | xargs basename
- 关于spark standalone模式下的executor问题
1.spark standalone模式下,worker与executor是一一对应的. 2.如果想要多个worker,那么需要修改spark-env的SPARK_WORKER_INSTANCES为2 ...
- win10下 Jupyter Notebook不运行python 3怎么办?
Jupyter Notebook不运行python 3怎么办? 内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用 我已经安装了Python 2的Anaco ...
- POJ3070 Fibonacci[矩阵乘法]【学习笔记】
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- C++最快的读取文件的方案(scanf,cin(及取消sync),fread)的详细对比
竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据.还有人说Pascal的rea ...
- CentOS 7 yum 安装subversion
yum list installed | grep subversionyum install subversioncd /var/wwwsvn -hsvn co svn://121.196.226. ...
- SlickMaster.NET 开源表单设计器快速使用指南
前言:在企业数据处理过程中,经常需要通过定制表单来输入业务数据.由于涉及的数据比较离散,并不同于ERP系统的紧密关联数据.假如由开发人员每个增加页面,工作量会比较大,后期后期的维护很升级也耗费时间和精 ...
- 在Eclipse添加Android兼容包( v4、v7 appcompat )(转)
昨天添加Android兼容包,碰到了很多问题,在这里记录一下,让后面的路好走. 如何选择兼容包, 请参考Android Support Library Features(二) 一.下载Support ...