026_01Toast之完全自定义

  Toast显示的时间最长是5S,有时候需要显示的时间更长;Toast默认背景是黑色的,有时候希望它更炫酷;所以,你需要自定义Toast。

那么,怎么去自定义呢?找到系统Toast源代码抽出来,依葫芦画瓢!分两步:

   1.获取Toast的对象:获取toast里面需要填充的view对象

   2.显示toast:设置一些显示的参数,获取一个窗口管理器,将该view加入到该窗口上

  通常Toast.makeText(Context context, CharSequence text, int duration).show一步搞定。那先来看看makeTest()方法中是些什么。

 1     public static Toast makeText(Context context, CharSequence text, int duration) {
 2         Toast result = new Toast(context);
 3
 4         LayoutInflater inflate = (LayoutInflater)
 5                 context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 6         View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
 7         TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
 8         tv.setText(text);
 9
10         result.mNextView = v;
11         result.mDuration = duration;
12
13         return result;
14     }

  可以看到黄色标注的填充了一个系统的布局文件,换成自己定义的布局文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     android:background="@drawable/call_locate_gray">
 7
 8     <TextView
 9         android:id="@+id/tv_mytoast_addr"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:layout_gravity="center_horizontal"
13         android:textColor="#000000"
14         android:drawableLeft="@android:drawable/stat_sys_phone_call"
15         android:shadowColor="#BB000000"
16         android:shadowRadius="2.75"
17         />
18
19 </LinearLayout>

  

 再来看看这个TN构造函数:

  private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();

 1         TN() {
 2             // XXX This should be changed to use a Dialog, with a Theme.Toast
 3             // defined that sets up the layout params appropriately.
 4             final WindowManager.LayoutParams params = mParams;
 5             params.height = WindowManager.LayoutParams.WRAP_CONTENT;
 6             params.width = WindowManager.LayoutParams.WRAP_CONTENT;
 7             params.format = PixelFormat.TRANSLUCENT;
 8             params.windowAnimations = com.android.internal.R.style.Animation_Toast;//自定义时删除
 9             params.type = WindowManager.LayoutParams.TYPE_TOAST;
10             params.setTitle("Toast");
11             params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
12                     | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
13                     | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
14         }

 源代码中有showMyToast()和hideMyToast()两个方法后,可以任意显示和关闭

    private WindowManager mWM;
    private View v;

 1     private void showMyToast(String addr) {
 2         //初始化view
 3         LayoutInflater inflate = (LayoutInflater)
 4                 getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 5         v = inflate.inflate(R.layout.mytoast_showaddr, null);
 6         TextView tv = (TextView)v.findViewById(R.id.tv_mytoast_addr);
 7         tv.setText(addr);
 8
 9
10
11           //private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
12
13           final WindowManager.LayoutParams params = new WindowManager.LayoutParams();;
14           params.height = WindowManager.LayoutParams.WRAP_CONTENT;
15           params.width = WindowManager.LayoutParams.WRAP_CONTENT;
16           params.format = PixelFormat.TRANSLUCENT;
17           //params.windowAnimations = com.android.internal.R.style.Animation_Toast;
18           params.type = WindowManager.LayoutParams.TYPE_TOAST;
19           params.setTitle("Toast");
20           params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
21                   | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
22                   | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
23
24           mWM = (WindowManager)getSystemService(Context.WINDOW_SERVICE);//获取窗口管理器并加入该view
25           mWM.addView(v, params);
26
27      }
1     private void hideMyToast(){
2
3         if (v!=null) {
4             mWM.removeView(v);
5         }
6         v=null;
7     }

效果图:本例是模仿手机管家中来电开启显示号码归属地功能。当来电时显示使用toast显示归属地,去电时toast消失。

源代码:

  1 package com.cskaoyan.mobilemanager.service;
  2
  3 import com.cskaoyan.mobilemanager.R;
  4 import com.cskaoyan.mobilemanager.dao.AdressQueryDao;
  5
  6 import android.app.Service;
  7 import android.content.Context;
  8 import android.content.Intent;
  9 import android.graphics.PixelFormat;
 10 import android.os.IBinder;
 11 import android.telephony.PhoneStateListener;
 12 import android.telephony.TelephonyManager;
 13 import android.view.LayoutInflater;
 14 import android.view.View;
 15 import android.view.WindowManager;
 16 import android.widget.TextView;
 17 import android.widget.Toast;
 18
 19 public class ShowCallLocation extends Service {
 20
 21     private TextView tv;
 22     private WindowManager mWM;
 23     private View v;
 24     private TelephonyManager tm;
 25     private MyPhoneCallListener listener;
 26
 27     @Override
 28     public IBinder onBind(Intent intent) {
 29         // TODO Auto-generated method stub
 30         return null;
 31     }
 32
 33     @Override
 34     public int onStartCommand(Intent intent, int flags, int startId) {
 35         tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
 36         listener = new MyPhoneCallListener();
 37         tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
 38
 39         System.out.println("ShowCallLocation.onStartCommand()");
 40         return super.onStartCommand(intent, flags, startId);
 41     }
 42
 43     class MyPhoneCallListener extends PhoneStateListener{
 44
 45         @Override
 46         public void onCallStateChanged(int state, String incomingNumber) {
 47             // TODO Auto-generated method stub
 48
 49             switch (state) {
 50             case TelephonyManager.CALL_STATE_IDLE:
 51                 hideMyToast();
 52                 break;
 53             case TelephonyManager.CALL_STATE_RINGING:
 54                 String addr = AdressQueryDao.querryAddr(incomingNumber);//取出来电查询到的号码归属地
 55                 System.out
 56                         .println("ShowCallLocation.MyPhoneCallListener.onCallStateChanged()"+addr);
 57                 Toast.makeText(getApplicationContext(), addr, 1).show();
 58
 59                 //显示一个自定义的toast
 60                  showMyToast(addr);
 61                 break;
 62             case TelephonyManager.CALL_STATE_OFFHOOK:
 63
 64                 break;
 65
 66
 67
 68             default:
 69                 break;
 70             }
 71             super.onCallStateChanged(state, incomingNumber);
 72         }
 73
 74
 75
 76     }
 77
 78     /*
 79      * 1.获取Toast的对象——:获取toast里面需要填充的view对象
 80      * 2.显示toast:设置一些显示的参数,获取一个窗口管理器,将该view加入到该窗口上
 81      * */
 82     private void showMyToast(String addr) {
 83         //初始化view
 84         LayoutInflater inflate = (LayoutInflater)
 85                 getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 86         v = inflate.inflate(R.layout.mytoast_showaddr, null);
 87         TextView tv = (TextView)v.findViewById(R.id.tv_mytoast_addr);
 88         tv.setText(addr);
 89
 90
 91
 92           //private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
 93
 94           final WindowManager.LayoutParams params = new WindowManager.LayoutParams();;
 95           params.height = WindowManager.LayoutParams.WRAP_CONTENT;
 96           params.width = WindowManager.LayoutParams.WRAP_CONTENT;
 97           params.format = PixelFormat.TRANSLUCENT;
 98           //params.windowAnimations = com.android.internal.R.style.Animation_Toast;
 99           params.type = WindowManager.LayoutParams.TYPE_TOAST;
100           params.setTitle("Toast");
101           params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
102                   | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
103                   | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
104
105           mWM = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
106           mWM.addView(v, params);
107
108      }
109
110     private void hideMyToast(){
111
112         if (v!=null) {
113             mWM.removeView(v);
114         }
115         v=null;
116     }
117
118     @Override
119     public void onDestroy() {
120         // TODO Auto-generated method stub
121         tm.listen(listener, PhoneStateListener.LISTEN_NONE);
122
123         if (tm!=null) {
124             tm=null;
125         }
126         if (listener!=null) {
127             listener=null;
128         }
129         super.onDestroy();
130         System.out.println("ShowCallLocation.onDestroy()");
131     }
132
133
134 }
时间: 2024-10-23 07:35:00

026_01Toast之完全自定义的相关文章

Linux centos下让alias自定义永久生效(+常用的别名)

alias可以简化一些复杂的命令串,使一个单词或简化后的命令即可实现复杂(通常是带很多参数的长串)命令. 基本用法: alias 简化命令='实际的长串命令'    //实际长串命令通常为'原命令 -/选项参数' eg. alias ll='ls -a' 获取别名: alias        //即可查看当前设定的所有alias别名 取消别名: unalias 简化命令 eg. unalias ll            //取消ll的别名 永久生效: 直接使用alias命令定义的别名,重启后就

MVC4 自定义错误页面(三)

一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.Web节点下加上 <customErrors mode="On"  defaultRedirect="~/Shared/Error" /> 翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

前端angularJS利用directive实现移动端自定义软键盘的方法

最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样.先看一下实现之后的效果: 实现的效果就是当点击页面中需要弹出软键盘的时候软键盘弹出,浮在页面的中间,和模态框一样的效果,可以在软键盘中输入任何数字,附带的功能有小数点.退格.清空.确定等功能.当在键盘上点击数字的时候页面中的表单中实时的添加对应的数字,上图中可以看到. 产品经理那边给的原因是iPad屏幕本来就小,如

自定义input[type=&quot;checkbox&quot;]的样式

对复选框自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :checkbox 来实现. 如果直接对复选框设置样式,那么这个伪类并不实用,因为没有多少样式能够对复选框起作用.不过,倒是可以基于复选框的勾选状态借助组合选择符来给其他元素设置样式. 很多时候,无论是为了表单元素统一,还是为了用户体验良好,我们都会选择 label 元素和 input[type="checkbox"] 一起使用.当<label>元素与复选框关联之后,也可以起到触发开关的作用. 思路:

[CSS揭秘]自定义单选框和复选框

很多Web前端工程师肯定都会遇到过,在项目中,UI设计师跑来跟你说,我这个地方的表单控件需要设计成这个样子那个样子.但是用CSS却不能够修改这些控件的默认样式,于是乎,只能通过div+javascript技术来进行模拟.特别是在如今移动端的崛起时代,更加注重用户的体验.于是就更加需要这样一种hack技术. 如果对如今的前端框架有过了解,都会知道组件这个概念.那么在这些框架中,都会提供一些单选框或复选框按钮组件.可见大家之前受到表单元素的默认样式的毒害有多深. 今天先给大家简单介绍一下如何通过CS

自定义元素(custom elements)

记录下自定义html自定义元素的相关心得: 浏览器将自定义元素保留在 DOM 之中,但不会任何语义.除此之外,自定义元素与标准元素都一致 事实上,浏览器提供了一个HTMLUnknownElement,HTMLElement对象,所有自定义元素都是该对象的实例. var tabs=document.createElement("tabs"); console.log(tabs instanceof HTMLUnknownElement);//true console.log(tabs i

wex5 教程 自定义action与名称去重

有一个订单,需要取出不同的客户名称,且只显示一次名称.效果如下图: 一 思路:自定义action,用sql语句的group by分组,将名称返回前端,用list显示出来. 二 制作步骤: 1 新建service service作为后端服务分发接口,一个工程可以有多个service,一个service可以有多个action. 2  新建action action基本参数: 名称:自定义 实现:(指向 java方法) 格式为 Name.getName   其中Name为java类,首写字母必须为大写

springmvc 类型转换器 自定义类型转换器

自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题: