写过一些小Android应用的开发者在创建框架时,为了提高代码复用率而设计一些基类和接口,同时也在一定程度上降低耦合度。那么在设计BaseActivity的时就需要其足够的抽象(通用),以便减少后面的重复代码。
其中一个常用的就是Activity的提示视图,一般用Toast,当然现在Snackbar也很方便了。设想一下show一个提示消息框,一定会需要哪些组件:
那么一定是:
(1) Context;
(2) Message(String);
后者作为发出消息的内容是必须作为参数的,但是后者如果作为参数,假设设计为showMessage(Context context,String message)这样,那么在每次使用时传入Snackbar依附的父视图的Context对象,但是这样不是最方便的:
比如:程序架构逐渐复杂的时候,很多的逻辑代码都会脱离Activity,但是Context是没法脱离的仍然需要使用。这时候就会有些不方便了。当然也有解决办法:
如下:
//修改Application的name属性,和自己定义的Application类路径相同
<application
android:name="com.test.team.global.MyApplication">
.....
.....
//MyApplication.java文件
package com.test.team.global;
import android.app.Application;
import android.content.Context;
/**
* 项目名称:QRScandoor
* 创建人:Created by zhiyuan.
* 创建时间:Created on 2016/9/9 17:01
* 修改备注:
*/
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
/**
* 得到应用程序级别的Context
* @return
*/
public static Context getContext() {
return context;
}
}
但是这只是获取到的Application级别的Context,Service、Activity、Application类型的Context还是有差别的,具体的请查看:这里写链接内容
这里提供一个更方便的办法解决这个问题:
/**
* 展示一个SnackBar
*/
public void showSnackBarWithAction(String message) {
//去掉虚拟按键
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隐藏虚拟按键栏
| View.SYSTEM_UI_FLAG_IMMERSIVE //防止点击屏幕时,隐藏虚拟按键栏又弹了出来
);
final Snackbar snackbar = Snackbar.make(getWindow().getDecorView(), message, Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("知道了", new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
//隐藏SnackBar时记得恢复隐藏虚拟按键栏,不然屏幕底部会多出一块空白布局出来,和难看
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
}).show();
}