内容简介:上篇完成了对Dialog的简单封装,本篇将对Android开发中另外两个常用工具类的封装:T(Toast)和L(Log)。这一步主要是将创建 Toast 的布局抽取出来,形成一个单独的工具类,调用的时候直接通过T.showToast进行调用即可,代码如下:这里需要注意的是,我们在
引言
上篇完成了对Dialog的简单封装,本篇将对Android开发中另外两个常用 工具 类的封装:T(Toast)和L(Log)。
正文
Toast的简单封装
这一步主要是将创建 Toast 的布局抽取出来,形成一个单独的工具类,调用的时候直接通过T.showToast进行调用即可,代码如下:
/** * 描述:Toast工具类. */ public class T { /** * 描述:Toast提示文本. * * @param textStr 文本 */ public static void showToast(Context context, String textStr) { Toast.makeText(context.getApplicationContext(), textStr, Toast.LENGTH_SHORT).show(); } /** * 描述:Toast提示文本. * * @param resId 文本的资源ID */ public static void showToast(Context context, int resId) { Context mContext = context.getApplicationContext(); showToast(mContext, mContext.getResources().getString(resId)); } }
这里需要注意的是,我们在 makeText
传入的 context
一定要使用 ApplicationContext
,以免造成 内存泄漏
。
运行起来看看效果吧:
Toast的自定义布局
前面使用的系统默认 Toast 样式,看上去并不怎么好看,所以我们需要进行自定义,进行美化。而Toast为我们提供了一个 setView
的方法,我们可以自行创建xml布局进行自定义实现,接下来就是进入自定义Toast布局的时间。
创建Toast背景
实现一个半透明的shap作为Toast的背景。
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="4dp" /> <solid android:color="#88000000" /> </shape>
创建Toast布局
xml主要就是放了一个TextView,然后设置TextView的背景、字号、颜色等。
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/toast_background" android:gravity="center" android:orientation="vertical" android:paddingBottom="12dp" android:paddingLeft="30dp" android:paddingRight="30dp" android:id="@+id/tv_msg" android:text="Toast" android:textColor="#fff" android:textSize="12sp" android:paddingTop="12dp"/>
创建Toast
这里需要注意的是:在showToast时候的参数Context是不定的,所以我们只能通过 context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
方式来获取布局解析器。
具体代码如下:
/** * 描述:Toast提示文本. * * @param text 文本 */ public static void showToast(Context context, String text) { // 获取布局解析器 LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (!TextUtils.isEmpty(text) && null != inflate) { // 解析布局 View layout = inflate.inflate(R.layout.layout_toast, null); TextView tvMsg = (TextView) layout.findViewById((R.id.tv_msg)); tvMsg.setText(text); Toast toast = new Toast(context.getApplicationContext()); // 底部距离150 toast.setGravity(Gravity.BOTTOM, 0, 150); toast.setDuration(Toast.LENGTH_SHORT); toast.setView(layout); toast.show(); } } /** * 描述:Toast提示文本. * * @param resId 文本的资源ID */ public static void showToast(Context context, int resId) { Context mContext = context.getApplicationContext(); showToast(mContext, mContext.getResources().getString(resId)); }
自定义Toast效果
完成代码编写,来看看效果吧:
看上去的确是要比系统的样式好看多了,那么Toast就暂时到这里。
Log
Log的选型
关于log,个人不建议对系统的log直接进行封装,系统的log有以下缺陷性:
无法定位log输出行(打印log的位置)
无法定义log的输出格式,如Json和xml
对于list、map等的输出不友好
不支持将log保持在文件中
针对以上缺陷,我推荐使用 logger 来进行基础封装,使用方法也比较简单。
Log的封装
依赖logger
api 'com.orhanobut:logger:2.2.0'
没有条件的同学记得使用阿里的中央仓库:
repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } }
T工具类也没有什么大的内容,只写了简单的几个常用方法,其它请自行斟酌、按需编码,就直接看代码吧:
/** * Logcat工具类 */ public class L { private L() { throw new UnsupportedOperationException("cannot be instantiated"); } /** * 是否需要打印bug,可以在application的onCreate函数里面初始化 */ public static boolean isDebug = true; // 下面四个是默认tag的函数 public static void i(String msg) { if (isDebug) Logger.i(msg); } public static void d(String msg) { if (isDebug) Logger.d(msg); } public static void e(String msg) { if (isDebug) Logger.e(msg); } public static void v(String msg) { if (isDebug) Logger.v(msg); } // 下面是传入自定义tag的函数 public static void i(String tag, String msg) { if (isDebug) Logger.e(msg); } public static void d(String tag, String msg) { if (isDebug) Logger.e(msg); } public static void e(String tag, String msg) { if (isDebug) Logger.e(msg); } public static void v(String tag, String msg) { if (isDebug) Logger.e(msg); } }
L演示
十分不想写这部分演示,果然还是踩到坑了:2.0版本增加了Adapter,必须要进行初始化 Logger.addLogAdapter(new AndroidLogAdapter());
才可以正常打印。
例子内容:
public void jsonLog(View view) { LoginDto.UserInfo userInfo = new LoginDto.UserInfo(); userInfo.setAge(25); userInfo.setEmail("aohanyao@gmail.com"); userInfo.setNickName("aohanyao"); userInfo.setUserName("aohanyao"); // 序列化成json L.json(new Gson().toJson(userInfo)); } public void listLog(View view) { List<String> list = new ArrayList<>(); list.add("jsonLog"); list.add("mapLog"); list.add("ordinaryLog"); L.list(list); } public void ordinaryLog(View view) { L.e("ordinaryLog"); }
运行结果:
最后
总结
完成了两个常用工具类的封装:T(Toast)和L(Log)
顺便更改了Example的结构页面
软广
一个痴心妄想想成为一个全屏(栈)工程师的程序猿。
来来,关注一下吧!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 封装JDBC—非框架开发必备的封装类
- SpringBlade 2.3.2 发布,增加 OSS 封装及单元测试封装
- SpringBlade 2.3.2 发布,增加 OSS 封装及单元测试封装
- docker 封装 alinode
- 封装Apk签名工具
- axios封装笔记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
疯狂Java讲义
李刚 / 电子工业出版社 / 2008-10 / 99.00元
《疯狂Java讲义》2000年至今,Java语言一直是应用最广的开发语言,并拥有最广泛的开发人群。如今,Java已经不再简单地是一门语言,它更像一个完整的体系,一个系统的开发平台。更甚至,它被延伸成一种开源精神。 《疯狂Java讲义》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编......一起来看看 《疯狂Java讲义》 这本书的介绍吧!