ps:写的很乱,没什么参考价值,我也是懵懵懂懂中,刚理清点套路,下次清晰到能讲了再写一篇
愁死我了,本来想自己封装个6.0动态获取权限工具类,查了查相关资料,看鸿洋大神的封装不错,activity和fragment用一套就可以,直接就开始学习加改造了,是我太天真,以为简简单单的注解看看就能学会,结果,,,,哎,决定写这篇博客就是因为我遇到这样一个问题:
啥都找不到???开始以为是忘记引入什么包了,跑去看hy大神的博客,人家这么写的,也没有什么我没引的包啊!!!!!百度一查,大家都是直接用的,我怎么就死活不行呢????昨天一天搞个注解都搞不出来,疯了疯了。。
这里说明一下,我要是和hy大神写的一摸一样肯定没问题,问题是不一样出现这个问题。哪儿不一样?我俩格式不一样,HY大神是这样:
compiler 以 lib 的形式被 sample 引用。
而我就“厉害了”,我非想不这么麻烦,直接在工程里建个包放compiler 就好了嘛!!!,我这么写的:
就这样差点搞死自己。。。。原因就是第一张图,各种找不到包。。怪我蠢,昨天真折腾了一天。
今天灵机一动,又百度了一下:java与javax包的区别:
java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包。
看到有人在eclipse上也找不到javax包,他在gradle文件里加了这样一句(这是我仿写的,他是jdk1.7):compile files(‘C:/Program Files/Java/jdk1.8.0_101/jre/lib/rt.jar’)
然后发现所有的javax包都找到了。运行发现不行。报错:
我猜是因为我jdk1.8的关系,我找个1.7的试试。
找了,发现换不了,studio只支持1.8及以上的,。。。。也许有可以的方法,但这么做总归是不好的,毕竟1.8有了新的方法。现在才知道hy大神写成那样是有原因的。
so?我还是照着hy大神的来吧,反正原理读懂了。而且挺喜欢这种注解的方式的。
只要把compiler 建成java lib 的形式就可以了,别建android的。真不要脸!不过毕竟注解是人家java的,android基础课程里都不带讲的。算了没啥计较的。由于Android目前不是完全支持Java 8的语言特性,会导致编译出错。这里新建的lib会自动将项目的源和目标兼容性值保留为 Java 7。
好了,既然都写到这里了,就把注解也简单记一下吧,顺便解释下hy大神的注解写法,感觉挺高级的。
注解
- java中常见的注解
- 定义注解
- 使用
java中常见的注解
定义注解
@interface 是定义注解
/**
* git_workspace
* <p>
* 定义一个注解
*
* @author liyuanli
* @data 2017/10/25
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String value();
// String desc();
//
// String author();
//
// int age() default 18;
}
interface是定义一个接口
/**
* git_workspace
* 定义一个接口
* @author liyuanli
* @data 2017/10/25
*/
public interface Person {
public String name();
public String sing();
}
*定义注解时各属性的含义及注意事项*
target是注解使用的位置或者说使用的对象,及时给类还是给方法定义的这个注解
retention是注解什么时候存在,图上挺清楚的
inherited代表允许子类继承:android不常用
documented:生成javadoc时会生成注解,这里android是不能用的,是javaee之类java开发工具可用的,例如后台写好的接口有加注释生成给移动组看,所以andoird用不着
这里是成员的说明,及注解中的方法。第二句提到一个成员时取名为value,这里不写成value也是不报错的,不过大家约定俗称的引用的时候如果只有一个成员就不写键了直接写值,这时候默认的键是value,所以,如果不把方法名写成value,引用的时候只有一个成员还不能直接写值会有点奇怪。
成员方法不能带有参数而且不能自定义异常即不能extends Exception
http://blog.csdn.net/industriously/article/details/53932425
看到篇很清楚的博客,非常棒,我都看懂了,更清晰了。看完我觉得我没啥说的了。
具体的看看还有大神的代码,就懂了。
简单记一下,利用注解实现接口回调的方式
- 首先一定要定义一个注解
@interface格式的
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ShowRequestPermissionRationale
{
int value();
}
- 写一个接口
interface 格式
public interface PermissionProxy<T> {
void grant(T source, int requestCode);
void denied(T source, int requestCode);
void rationale(T source, int requestCode);
boolean needShowRationale(int requestCode);
}
- 使用注解
@ShowRequestPermissionRationale(REQUECT_CODE_SDCARD)
public void whyNeedSdCard() {
Toast.makeText(this, "I need write news to sdcard!", Toast.LENGTH_SHORT).show();
PermissionsUtil.requestPermissions(MainActivity.this, REQUECT_CODE_SDCARD, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
。。。。。有点复杂,简单记不了,这篇作废,看完这本书重新巩固的时候一定理清楚