Android 之路 (6) - 关于Toast和Log的封装

栏目: Android · 发布时间: 5年前

内容简介:上篇完成了对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 ,以免造成 内存泄漏

运行起来看看效果吧:

Android 之路 (6) - 关于Toast和Log的封装

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效果

完成代码编写,来看看效果吧:

Android 之路 (6) - 关于Toast和Log的封装 看上去的确是要比系统的样式好看多了,那么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");
    }

运行结果:

Android 之路 (6) - 关于Toast和Log的封装

最后

总结

完成了两个常用工具类的封装:T(Toast)和L(Log)

顺便更改了Example的结构页面

源码-tag-v0.06

软广

一个痴心妄想想成为一个全屏(栈)工程师的程序猿。

来来,关注一下吧!

Android 之路 (6) - 关于Toast和Log的封装

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂Java讲义

疯狂Java讲义

李刚 / 电子工业出版社 / 2008-10 / 99.00元

《疯狂Java讲义》2000年至今,Java语言一直是应用最广的开发语言,并拥有最广泛的开发人群。如今,Java已经不再简单地是一门语言,它更像一个完整的体系,一个系统的开发平台。更甚至,它被延伸成一种开源精神。 《疯狂Java讲义》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编......一起来看看 《疯狂Java讲义》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试