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…
後期我會獻上這個庫的源碼解析。框架

相關文章
相關標籤/搜索