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,然后在 ...
随机推荐
- Intellij IDEA Debug调试技巧
1.这里以一个web工程为例,点击图中按钮开始运行web工程. 2.设置断点 3.使用postman发送http请求 4.请求发送之后会自动跳到断点处,并且在断点之前会有数据结果显示 5.按F8 在 ...
- UI 框架
Vue.js 之 iView UI 框架 像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引用一下,不需要就删除.故观 ...
- 【LOJ】#2182. 「SDOI2015」寻宝游戏
题解 终于了解怎么动态维护虚树了 就是把点按照dfs序排个序啊 这道题显然是求虚树上所有边长的两倍 我们把dfs序排完序,相邻两个点加上路径长(包括首尾),删除的时候删一个点减去它到两边再加上新近相邻 ...
- java学习之借书系统
实现的图书借阅系统要处理用户输入的非法参数,并引导用户正确使用 测试结果: 主要目的就是练习异常处理中的Exception类的使用 使用的相关语法 try{ //可能产生异常的代码块 }catch(E ...
- js变量和函数声明的提升(转)
原文:http://zha-zi.iteye.com/blog/2037026 下面的程序是什么结果? var foo = 1; function bar() { if (!foo) { var fo ...
- Postman高级应用——串行传参和动态传参详解
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用 ...
- Python中命名空间与作用域使用总结
1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...
- poj-2421-最小生成树刷题
title: poj-2421-最小生成树刷题 date: 2018-11-20 20:30:29 tags: acm 刷题 categories: ACM-最小生成树 概述 做了几道最小生成树的题, ...
- BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)
题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...
- BZOJ2924 : [Poi1998]Flat broken lines
首先旋转坐标系 $x'=x-y$ $y'=-x-y$ 则对于一个点,它下一步可以往它左上角任意一个点连线. 根据Dilworth定理,答案=这个偏序集最长反链的长度. 设f[i]为到i点为止的最长反链 ...