weex+android原生开发学习笔记(七)

 

 

                                                                     weex+android原生开发学习笔记(七)_第1张图片

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)
        

 

你可能感兴趣的:(weex+android原生开发学习笔记(七))