Android 开发中不得不知道的 Tips 集合 (持续更新 ing)

1.sp仍是dp?

众所周知,官方建议咱们字体的单位使用sp,这样用户在“系统设置”中调整了系统字体大小的时候,咱们app中的字体会随着系统字体的大小而改变。So,众猿机智的在布局文件中写下了如下代码javascript

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="this is text"
        android:textSize="15sp" />复制代码

固然上述TextView不会有什么问题,由于这货height是自适应的。可是不少情境下,例如ListView或者Recyclerview的item中,高度是固定的时候,sp就会有适配问题,例如
java


解决方案:
在Application中重写onConfigurationChanged 强制字体不随着系统改变而改变(微信也是这么干的)

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        if (newConfig.fontScale != 1)//非默认值
            getResources();
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public Resources getResources() {
        Resources res = super.getResources();
        if (res.getConfiguration().fontScale != 1) {//非默认值
            Configuration newConfig = new Configuration();
            newConfig.setToDefaults();
            //设置默认
            res.updateConfiguration(newConfig, res.getDisplayMetrics());
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                createConfigurationContext(newConfig);
            } else {
                res.updateConfiguration(newConfig, res.getDisplayMetrics());
            }
        }
        return res;
    }复制代码

2.使用PhotoView+Viewpager崩溃问题

这几天碰到一个诡异的问题,PhotoView+Viewpager开发图集效果的时候,在三星Galxy系列手机上手指放大的时候没问题,手指捏合的时候出现java.lang.IllegalArgumentException: pointerIndex out of range 异常而后闪退。Google了一波,说是三星系统的Bug。。。我等应用层开发汪总不见得给每一个三星用户修改一下底层代码吧。android

解决方案:
自定义一个Viewpager,重写onInterceptTouchEvent函数,在里面捕获IllegalArgumentException就妥了。git

public class PhotoViewPager extends android.support.v4.view.ViewPager {
    public PhotoViewPager(Context context) {
        super(context);
    }

    public PhotoViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        try {
            return super.onTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }
}复制代码

布局文件中用PhotoViewPager代替系统原生的ViewPager就好啦。github

3.什么?DatePickerDialog有Bug?

项目中用到了修改用户生日的功能,打算直接用DatePickerDialog来作一个时间选择起,而后诡异的事情发生了。用户选择完时间以后onDateSelect的回调函数居然执行了两次。原来4.1跟4.2版本有个系统Bug,这时候咱们须要从新定义一个DatePickerDialog来屏蔽onStop方法。浏览器

public class RepairDatePickDialog extends DatePickerDialog {
    public RepairDatePickDialog(Context context, OnDateSetListener callBack,
                                int year, int monthOfYear, int dayOfMonth) {
        super(context, callBack, year, monthOfYear, dayOfMonth);
        // TODO Auto-generated constructor stub
    }

    public RepairDatePickDialog(Context context, int theme,
                                OnDateSetListener callBack, int year, int monthOfYear,
                                int dayOfMonth) {
        super(context, theme, callBack, year, monthOfYear, dayOfMonth);
        // TODO Auto-generated constructor stub
    }

    protected void onStop() {
        // TODO Auto-generated method stub
    }
}复制代码

4.浏览器中打开自家App的那些套路

大致的需求是用户分享出去链接,被分享的用户在浏览器中打开此链接,若是该用户设备上有咱们的app则吊起app,若是没有则通知用户去下载咱们的app
以前写过一片博客,详细的介绍了这种Deeplink的实现方式,请移步
juejin.im/entry/590fe…
github地址
github.com/weixinjie/D…微信

5.Android路由机制浅析

大厂的客户端里面都用了路由来实现页面以前的跳转,引入路由机制并不全是为了页面之间的解耦合,更多的是为了配合运营的套路。例如:大部分app里面都有Banner,这个Banner不必定全是打开Webview。有的Banner item打开的是充值页面,有的Banner item打开的是用户详情页面等。固然你能够为了Banner来写一个Map集合,每次用户点击Banner的时候Switch一下type,而后打开相应的页面,可是若是用户在浏览器中Deeplink到本地客户端呢?是否是也要实现一套Map?若是是在Webview中与js交互打开各个页面呢?是否是还要实现一套Map?app

推荐一个很好用的路由框架
github.com/mzule/Activ…
后期我会献上这个库的源码解析。框架

相关文章
相关标签/搜索