1、Retrofit访问接口返回异常 ( Expected ':status' header not present )
整理:https://blog.csdn.net/u010326875/article/details/89189334
2、android(poi.jar 和 jxl.jar)实现Excel的读取:
jxl参考:https://blog.csdn.net/qq_36982160/article/details/82421940
poi参考:https://blog.csdn.net/shangming150/article/details/78261095
3、weex屏幕高度计算和适配:
参考:https://blog.csdn.net/zhuweideng/article/details/81974572
weex的规则是屏幕宽度是750px 而高度是根据宽高比算出来的.. 也就是高度是不固定的.. weex-ui中的utils中有获取屏幕高度的方法.. 但是就是开头提到的问题.. android上会少88px;
所以只能自己封装个获取高度的方法
import {Utils} from 'weex-ui'
const screenHeight = Utils.env.getPageHeight() ;
const androidNavHeight = Utils.env.isAndroid() ? 88 : 0;
return screenHeight +androidNavHeight;
用这样的方法获取的高度.. 再设置给scroller才可以使用.. 当然如果你的界面里还有其他控件.. 高度还要再减去那些.. 不然scroller会包裹内容高度..
4、git在提交代码的时候怎样配置,那些目录代码提交或者过滤掉的:
.gitignore 文件配置过滤的目录
参考:https://www.cnblogs.com/youyoui/p/8337147.html
比如:Git 忽略规则匹配语法
在 .gitignore 文件中,每一行的忽略规则的语法如下:
空格不匹配任意文件,可作为分隔符,可用反斜杠转义
# 开头的文件标识注释,可以使用反斜杠进行转义
! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
/ 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
/ 开始的模式匹配项目跟目录
如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
** 匹配多级目录,可在开始,中间,结束
? 通用匹配单个字符
[] 通用匹配单个字符列表
常用匹配示例:
bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 忽略根目录下的bin文件
/*.c: 忽略 cat.c,不忽略 build/cat.c
debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo: 忽略/foo, a/foo, a/b/foo等
a/**/b: 忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
*.log: 忽略所有 .log 文件
config.php: 忽略当前路径的 config.php 文件
5、android 依赖项目 跳转到APP项目下的类:
利用包名反射获取类:
Intent intent=new Intent();
try {
Class updateClass = Class.forName("com.jdy.jdyworker.UI.activity.myActivity.UpdataCentertifiActivity");
intent.setClassName(context, updateClass.getName());
context.startActivity(intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
6、android 依赖项目,反射App类下的方法:
@JSMethod(uiThread = true)
public void checkAuthState(){
Activity context = (Activity) mWXSDKInstance.getContext();
try {
//反射找到对应的类
Class authClass = Class.forName("com.jdy.jdyworker.Util.AliRealAuthenticatUtil");
//获取AliRealAuthenticatUtil实例
Method methodGetInstance = authClass.getMethod("getInstance");
Object instanceObj = methodGetInstance.invoke(null);
//获取所有方法中的 realAuthent 方法执行
Method[] methods = authClass.getMethods();
for (Method method : methods){
if(method.getName().equals("realAuthent")){
method.invoke(instanceObj,context,null);// 参数(对应类的实例、参数context、参数null)
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
7、weex中js处理日期的库:moment
参考链接:http://momentjs.cn/
import moment from 'moment'
let sourceDate = '2019-7-25 16:17:35';
let resultDate = moment(sourceDate).format('YYYY-MM-DD'); // 2019-7-25
8、android 依赖项目,反射App类下的属性和值:
Class constantsConfigClass = Class.forName("com.jdy.jdyworker.constant.ConstantsConfig");
Field field = constantsConfigClass.getDeclaredField("UP_CERTIFICATE");
String typeField = "upCertivicate";//设个默认值,实际按照属性field去获取
String typeName = (String)field.get(typeField);
9、android 依赖项目,intent跳转传递反射的数据:
/**
* 跳转到添加证书的页面
*/
@JSMethod(uiThread = true)
public void intent2UpdateCertificateActivity(Map certificateDetail){
Activity context = (Activity) mWXSDKInstance.getContext();
Intent intent=new Intent();
try {
Class updateClass = Class.forName("com.jdy.jdyworker.UI.activity.myActivity.UpdataCentertifiActivity");
if(certificateDetail!=null){
//用作获取Config类里的key
Class constantsConfigClass = Class.forName("com.jdy.jdyworker.constant.ConstantsConfig");
//获取Config中的这个属性的值作为key
Field field = constantsConfigClass.getDeclaredField("UP_CERTIFICATE");
//设个默认值,实际按照属性field去获取
String typeField = "upCertivicate";
//Intent.putExtra的key
String typeName = (String)field.get(typeField);
//数据bean的类
Class certificateInfoClass = Class.forName("com.jdy.jdyworker.pojo.CertificateInfo");
Object object = null;
try {
//通过反射,把当前的Map对象certificateDetail的所有属性,转成CertificateInfo数据bean
object = certificateInfoClass.newInstance();
//获取CertificateInfo数据bean的所有属性
Field[] fields = certificateInfoClass.getDeclaredFields();
for (Field fieldItem : fields) {
String fieldName = fieldItem.getName();
if (certificateDetail.get(fieldName) == null)
continue;
String firstC = fieldName.substring(0, 1);
//处理bean的属性方法名称,比如setName
String resultName = "set" + fieldName.replaceFirst(firstC, firstC.toUpperCase());
//反射获取setName方法
Method method = certificateInfoClass.getMethod(resultName,fieldItem.getType());
if (resultName.equals(method.getName())) {
if(fieldName.equals("photos")){
Class cl =fieldItem.getType();//class java.util.ArrayList 可以用作判断属性值是什么类型
JSONArray photos = (JSONArray)certificateDetail.get(fieldName);
List photosList = new ArrayList<>();
for(int index = 0; index < photos.size(); index++){
photosList.add(photos.get(index).toString());
}
//反射调用方法并传递参数
method.invoke(object, photosList);
}else{
//反射调用方法并传递参数
method.invoke(object, certificateDetail.get(fieldName));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
//intent传递参数
intent.putExtra(typeName,(Serializable) object);
}
intent.setClassName(context, updateClass.getName());
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
10、weex扩展控件的时候:
控件中的数据列表要有默认值的时候,设置的方式:
组件内部:this.$set(val, 'checked', !val.checked);
对应在使用这个控件的数据改变
组件外部:this.$set(data,'checked',true)