如果你要封装工具类,注意使用static关键字
有错误或者需要补充的欢迎及时指正~~
显示一段土司
private Toast toast;
public void showToast(Context context, String text) {
if (toast == null) {
toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
} else {
toast.setText(text);
}
toast.show();
}
调用:showToast(上下文, 土司内容)
说明:Toast是可以用Application的Context当上下文的,如果你有写Application类,可以直接把它的单例弄过来,这样就又少传一个参数了。友情提示Application的单例应该这样写
public class MyApp extends Application {
private static MyApp myApp;
public static MyApp getInstance() {
return myApp;
}
@Override
public void onCreate() {
super.onCreate();
myApp = this;
}
}
显示一段Snackbar
public void showSnackBar(final Activity activity, String text, String action, View.OnClickListener listener, Snackbar.Callback callback){
View rootView = ((ViewGroup) (activity.findViewById(android.R.id.content))).getChildAt(0);
final Snackbar snackbar = Snackbar.make(rootView, text, Snackbar.LENGTH_LONG);
snackbar.setAction(action, listener);
snackbar.setCallback(callback);
snackbar.show();
}
调用:showSnackBar(当前Activity, 提示文字, 按钮文字, 点击回调, Snackbar回调)
说明:Snackbar和Toast 就不一样了,显示环境必须有一个 View,这里选择把当前Activity的rootView传给它,可避免它与导航栏的不河蟹问题。此封装参数较多(还没涉及颜色呢),建议根据实际应用场景再重载几个。比如你没打算让Snackbar消失时再做什么事,最后那个Callback就可以传null(当然要自己把相关判断做了)
获取屏幕宽度、高度
public int getScreenWidth(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Point point = new Point();
wm.getDefaultDisplay().getRealSize(point);
//point.x是宽度,point.y是高度,当然,方法名应该做相应改变
return point.x;
}
调用:getScreenWidth(上下文)
说明:上下文可以传Application的Context。getWidth()和getHeight()两个方法已过时,不推荐再用
双击返回键,退出应用
private boolean mFlag = false;
private long mTimeout = -1;
private long time = 3000l;//判定时间(单位毫秒),这里设为3秒
private boolean checkBackAction() {
boolean flag = mFlag;
mFlag = true;
boolean timeout = (mTimeout == -1 || (System.currentTimeMillis() - mTimeout) > time);
if (mFlag && (mFlag != flag || timeout)) {
mTimeout = System.currentTimeMillis();
//这里写给用户的提示,比如“再点击一次退出应用”
return true;
}
return !mFlag;
}
调用:重写Activity的onKeyDown()方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (checkBackAction()) {
//这里写与退出应用有关的逻辑
return true;
}
return super.onKeyDown(keyCode, event);
}
说明:给用户的提示建议用Toast或者Snackbar。
点击空白处,隐藏软键盘
//过程稍微复杂一些,分成三段写,这个是主方法
private void hideSoftInput(Context context, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHide(v, ev)) {
doHide(context, v.getWindowToken());
}
}
}
public boolean isShouldHide(View v, MotionEvent event) {
//这里是用常用的EditText作判断参照的,可根据情况替换成其它View
if (v != null && (v instanceof EditText)) {
int[] l = {0, 0};
v.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth();
boolean b = event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom;
return !b;
}
return false;
}
public void doHide(Context context, IBinder token) {
if (token != null) {
InputMethodManager im = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
调用:重写Activity的dispatchTouchEvent()方法
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
hideSoftInput(this, ev);
return super.dispatchTouchEvent(ev);
}
说明:调用时传的是this,实际上也可以传Application的Context。另外单就隐藏软键盘而言,方法有很多,这里给出的并非最优解,有兴趣可继续搜索。
状态栏透明化
//Android5.0(API 21)也就是Lollipop以上的版本才能实现
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
没有外传参数,一般不用封装,直接写到你的Activity的onCreate()或者Fragment(这时需要先getActivity()再getWindow())的onCreateView()方法里面就行,页面较多时建议弄一个base父类。
说明:如果有ToolBar或者ActionBar,状态栏会和它们一体化,这时你也可以选择把bar隐藏或设成透明。另外如果写成下面这样
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
结果就是导航栏也跟着变透明了。游戏一类的应用可以这么写,看图的话见仁见智,我本人更喜欢保留导航栏