衆所周知,官方建議咱們字體的單位使用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
@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;
}複製代碼
這幾天碰到一個詭異的問題,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
項目中用到了修改用戶生日的功能,打算直接用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
}
}複製代碼
大致的需求是用戶分享出去鏈接,被分享的用戶在瀏覽器中打開此鏈接,若是該用戶設備上有咱們的app則吊起app,若是沒有則通知用戶去下載咱們的app
以前寫過一片博客,詳細的介紹了這種Deeplink的實現方式,請移步
juejin.im/entry/590fe…
github地址
github.com/weixinjie/D…微信
大廠的客戶端裏面都用了路由來實現頁面以前的跳轉,引入路由機制並不全是爲了頁面之間的解耦合,更多的是爲了配合運營的套路。例如:大部分app裏面都有Banner,這個Banner不必定全是打開Webview。有的Banner item打開的是充值頁面,有的Banner item打開的是用戶詳情頁面等。固然你能夠爲了Banner來寫一個Map集合,每次用戶點擊Banner的時候Switch一下type,而後打開相應的頁面,可是若是用戶在瀏覽器中Deeplink到本地客戶端呢?是否是也要實現一套Map?若是是在Webview中與js交互打開各個頁面呢?是否是還要實現一套Map?app
推薦一個很好用的路由框架
github.com/mzule/Activ…
後期我會獻上這個庫的源碼解析。框架