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回调)
说明:SnackbarToast 就不一样了,显示环境必须有一个 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;
}

调用:重写ActivityonKeyDown()方法

@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);
    }
}

调用:重写ActivitydispatchTouchEvent()方法

@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);
}

没有外传参数,一般不用封装,直接写到你的ActivityonCreate()或者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);
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容