整理出这些问题分享给大家,是为了避免大家在遇到此类坑时,犯同样错。
一.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);
登录界面如下:
键盘弹起时出现的效果如下:
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竖屏根据重力上下翻转。