android 状态栏一体化 fragment,Android开发常用的Util方法(屏幕UI篇)

如果你要封装工具类,注意使用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);

}

结果就是导航栏也跟着变透明了。游戏一类的应用可以这么写,看图的话见仁见智,我本人更喜欢保留导航栏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值