整理出這些問題分享給大家,是為了避免大家在遇到此類坑時,犯同樣錯。
一.Xstream遇到的坑
1.對于Xml解析實體,在更新版本時,增加了字段,老版本發生解析錯誤,無法解析出相應實體
1.1原本xml解析代碼
public static <T> T toBean(String xmlStr, Class<T> cls) {
XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(cls);
return (T) xstream.fromXML(xmlStr);
}
這樣的代碼的確可以解析出實體,可是在拓展時,就出現如上問題。
1.2改進之后xml解析代碼
public static <T> T toBean(String xmlStr, Class<T> cls) {
XStream xstream = new XStream(new DomDriver()) {
@Override
protected MapperWrapper wrapMapper(MapperWrapper next) {
return new MapperWrapper(next) {
@Override
public boolean shouldSerializeMember(Class definedIn, String fieldName) {
if (definedIn == Object.class) {
return false;
}
return super.shouldSerializeMember(definedIn, fieldName);
}
};
}
};
xstream.processAnnotations(cls);
return (T) xstream.fromXML(xmlStr);
}
2.對于編輯后臺Xml文件時,使用默認編輯器,傳到前臺會默認帶“\uFEFF”字段串問題
2.1問題詳細描述
今天剛剛在后臺改了升級接口的xml文件,我當時是用Windows自帶文本編輯器編輯的,修改了xml內容,可是改完后,安卓前臺出現“xml解析錯誤”問題,我以為我xml的換行有問題,結果我多次修改后,還是出現“xml解析錯誤”問題,然后我選擇安卓前臺調試,發現后臺得到的字符串,在java前臺使用時,字符串前面總是帶“\uFEFF”字符串,查閱資料得知這是帶BOM頭的UTF-8的編碼字符集,這是為了兼容UTF-16等編碼字符集,但是Java處理此編碼時,會默認加“\uFEFF”字符串。
2.2問題得到的解決方法
我的解決方法是,用默認編碼字符集的EditPlus編輯器新建了此xml文件,將老文件的內容復制到此文件內,然后這個問題才得以解決。
二.鍵盤彈起,按鈕被遮蓋問題
1.詳細問題描述
在諸如登錄界面時,鍵盤彈起,總是遮蓋住登錄按鈕,這大打折扣了用戶體驗,為了優化,我封裝了工具類,只需傳Activity,rootview和按鈕view。但是在遇到RelativeLayout布局時出現了問題,鍵盤會將layout_alignParentBottom屬性為true的ViewGroup頂起,原本代碼如下:
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
登錄界面如下:
圖片.png
鍵盤彈起時出現的效果如下:
圖片.png
2.問題得到的解決方法
if(!(rootView instanceof RelativeLayout)){
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
開發App都繞不過的坑-代碼兼容性
安卓開發比IOS開發區別最大的在于一點:安卓碎片化,這樣大大增加了代碼的開發難度性,與減小了App的穩定性。
關于screenOrientation的筆記
android:screenOrientation = ["unspecified" | "behind" |
"landscape" | "portrait" |
"reverseLandscape" | "reversePortrait" |
"sensorLandscape" | "sensorPortrait" |
"userLandscape" | "userPortrait" |
"sensor" | "fullSensor" | "nosensor" |
"user" | "fullUser" | "locked"]
其中sensorLandscape就是橫屏根據重力上下翻轉,sensorPortrait豎屏根據重力上下翻轉。