① 如何在android studio 中使用自定义注解处理器
原料 android studio 步骤 在file里面选择setting 如下型粗图选择 如下图选择,消租贺拿派在右上的编辑框里编辑注释 编辑完毕,点击OK保存 新建一个类,刚才编辑好的注释就可用了
② Android 自定义注解之运行时注解(RetentionPolicy.RUNTIME)
RetentionPolicy.RUNTIME:注解不仅被缺握保存到class文件中,jvm加载class文件之后,仍然存伏橡庆如败在
③ android dagger2在fragment中怎么用
在component中inject fragment就好
AppComponent通常提供全局的对象以便于其他的组件依赖使用,比如context,rest api接口等,这些都是全局的单例对象
MainActivityComponent特意针对MainActivity,所以它只提供其对应的MainActivityPresenter,因为其依赖AppComponent,所以它可以使用AppComponent提供的对象
这里使用http://blog.csdn.net/tiankong1206/article/details/46486401 这里的一个例子,主要把其中的一些细节稍微说的详细点,下面这一段说明来自网上:
@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Mole: Moles类里面的方法专门提供依赖,所以我们定义一个类,用@Mole注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。moles的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的moles)。
@Provide: 在moles中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Mole的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Moles组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的moles知道依赖的范围。
@Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。
1、首先是Mole
[java] view plain print?
@Mole
public class MainActivityMole {
private MainActivity mainActivity;
public MainActivityMole(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Provides
@ActivityScope
MainActivity provideMainActivity() {
return mainActivity;
}
@Provides
@ActivityScope
MainActivityPresenter provideMainActivityPresenter(MainActivity mainActivity, User user) {
return new MainActivityPresenter(mainActivity, user);
}
}
注意里面的provide方法,我们后面还可以看到,这里的语法是@Mole @Providers
然后是Component
[java] view plain print?
@ActivityScope
@Component(moles = {MainActivityMole.class , AppServiceMole.class})
public interface MainActivityComponent {
MainActivity inject(MainActivity mainActivity);
}
这里的MainActivityComponent包含两个Mole,一个是我们上面列出来的MainActivityMole,另一个是AppServiceMole
接下来就是使用了,在MainActivity中:
[java] view plain print?
@Override
protected void setupActivityComponent() {
DaggerMainActivityComponent.builder()
.mainActivityMole(new MainActivityMole(this))
.appServiceMole(new AppServiceMole())
.build()
.inject(this);
}
这里在build之前把Component用到的每一个Mole的构造函数初始化一下,在build之后inject注入,我们看一下这个自动生成的DaggerMainActivityComponent
[java] view plain print?
package com.example.lwp.mvp.ui.activity.component;
import com.example.lwp.mvp.data.AppServiceMole;
import com.example.lwp.mvp.data.AppServiceMole_ProvideUserFactory;
import com.example.lwp.mvp.model.User;
import com.example.lwp.mvp.ui.activity.MainActivity;
import com.example.lwp.mvp.ui.activity.MainActivity_MembersInjector;
import com.example.lwp.mvp.ui.activity.mole.MainActivityMole;
import com.example.lwp.mvp.ui.activity.mole.MainActivityMole_ProvideMainActivityFactory;
import com.example.lwp.mvp.ui.activity.mole.MainActivityMole_;
import com.example.lwp.mvp.ui.activity.presenter.MainActivityPresenter;
import dagger.MembersInjector;
import dagger.internal.MembersInjectors;
import dagger.internal.ScopedProvider;
import javax.annotation.Generated;
import javax.inject.Provider;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerMainActivityComponent implements MainActivityComponent {
private Provider<MainActivity> provideMainActivityProvider;
private Provider<User> provideUserProvider;
private Provider<MainActivityPresenter> ;
private MembersInjector<MainActivity> mainActivityMembersInjector;
private DaggerMainActivityComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
private void initialize(final Builder builder) {
this.provideMainActivityProvider = ScopedProvider.create(MainActivityMole_ProvideMainActivityFactory.create(builder.mainActivityMole));
this.provideUserProvider = AppServiceMole_ProvideUserFactory.create(builder.appServiceMole);
this. = ScopedProvider.create(MainActivityMole_.create(builder.mainActivityMole, provideMainActivityProvider, provideUserProvider));
this.mainActivityMembersInjector = MainActivity_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), );
}
@Override
public MainActivity inject(MainActivity mainActivity) {
mainActivityMembersInjector.injectMembers(mainActivity);
return mainActivity;
}
public static final class Builder {
private MainActivityMole mainActivityMole;
private AppServiceMole appServiceMole;
private Builder() {
}
public MainActivityComponent build() {
if (mainActivityMole == null) {
throw new IllegalStateException("mainActivityMole must be set");
}
if (appServiceMole == null) {
this.appServiceMole = new AppServiceMole();
}
return new DaggerMainActivityComponent(this);
}
public Builder mainActivityMole(MainActivityMole mainActivityMole) {
if (mainActivityMole == null) {
throw new NullPointerException("mainActivityMole");
}
this.mainActivityMole = mainActivityMole;
return this;
}
public Builder appServiceMole(AppServiceMole appServiceMole) {
if (appServiceMole == null) {
throw new NullPointerException("appServiceMole");
}
this.appServiceMole = appServiceMole;
return this;
}
}
}
这里面有两个类,一个是DaggerMainActivityComponent,另一个是Build类,Build中就是几个模块的初始化以及build方法构建DaggerMainActivityComponent类并初始化。DaggerMainActivityComponent类中定义了很多provider成员,这些成员就是Mole中提供的一些provider方法,还有其中的一些成员方法中的参数,那么这些各个类构造函数是怎么调用的呢,其实,我们Mole中每一个定义的provide方法,都会生成一个MainActivityMole_类似的类
[java] view plain print?
package com.example.lwp.mvp.ui.activity.mole;
import com.example.lwp.mvp.model.User;
import com.example.lwp.mvp.ui.activity.MainActivity;
import com.example.lwp.mvp.ui.activity.presenter.MainActivityPresenter;
import dagger.internal.Factory;
import javax.annotation.Generated;
import javax.inject.Provider;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class MainActivityMole_ implements Factory<MainActivityPresenter> {
private final MainActivityMole mole;
private final Provider<MainActivity> mainActivityProvider;
private final Provider<User> userProvider;
public MainActivityMole_(MainActivityMole mole, Provider<MainActivity> mainActivityProvider, Provider<User> userProvider) {
assert mole != null;
this.mole = mole;
assert mainActivityProvider != null;
this.mainActivityProvider = mainActivityProvider;
assert userProvider != null;
this.userProvider = userProvider;
}
@Override
public MainActivityPresenter get() {
MainActivityPresenter provided = mole.provideMainActivityPresenter(mainActivityProvider.get(), userProvider.get());
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory<MainActivityPresenter> create(MainActivityMole mole, Provider<MainActivity> mainActivityProvider, Provider<User> userProvider) {
return new MainActivityMole_(mole, mainActivityProvider, userProvider);
}
}
可以看到,这里面在需要MainActivityPresenter时候可以调用它的get方法,MainActivityPresenter的构造函数依赖另外两个对象,我们看他们其中他一个的Factory函数
[java] view plain print?
package com.example.lwp.mvp.ui.activity.mole;
import com.example.lwp.mvp.ui.activity.MainActivity;
import dagger.internal.Factory;
import javax.annotation.Generated;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class MainActivityMole_ProvideMainActivityFactory implements Factory<MainActivity> {
private final MainActivityMole mole;
public MainActivityMole_ProvideMainActivityFactory(MainActivityMole mole) {
assert mole != null;
this.mole = mole;
}
@Override
public MainActivity get() {
MainActivity provided = mole.provideMainActivity();
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory<MainActivity> create(MainActivityMole mole) {
return new MainActivityMole_ProvideMainActivityFactory(mole);
}
}
这是MainActivity的Provider,可以看到它的get函数最后调用了mole也就是MainActivityMole中的provideMainActivity,这里就直接返回了一个MainActivity,所以,如果我们的构造函数中含有参数,dragger也会调用相应参数的Provider的Facory来生成相应的参数
从这里也可以看出这些类之间的构造依赖不能构成环路。
}
④ Android 自定义View
1.直接在XML文件中定义的 ==》布局文件。
2.在XML文件中通过style这个属性定义的 ==》在布局中使铅敏迅用自定义属性样式。
3.通过defStyleAttr定拿薯义的 ==》在View的构造方法中使用自定义属性样式。
4.通过defStyleRes定义的 ==》在View的构造方法中使用自定义槐此样式。
5.直接在当然工程的theme主题下定义的 ==》AndroidManifest.xml中设置。
1、onMeasure 测量自身,自定义View时重写,定义控件的宽高,常在自定义的View中使用
2、Measure 测量自身,方法不可重写,内部调用onMeasure方法,常在自定义的ViewGroup中使用
3、measureChild 测量某个子View,内部调用Measure方法,常在自定义的ViewGroup中使用
4、measureChildren 测量所有子View,内部调用measureChild方法,常在自定义的ViewGroup中使用
在自定义View的开发中,我们重写测量方法,方法里的传参(widthMeasureSpec,heightMeasureSpec)都是由父类提供的,在自定义ViewGroup的开发中,我们可以根据当前布局的测量参数,为布局内的子控件创建新的测量参数,来控制子View在布局的显示大小
1、layout:指定View新的显示位置,用法:view.layout(left,top,right,bottom);
2、onLayout:设置View的显示位置,用法:重写该方法,定义View的显示规则
3、requestLayout:强制View重新布局,用法:view.requestLayout();
onFinishInflate -> onAttachedToWindow -> onMeasure -> onSizeChanged -> onLayout -> onDraw -> onDetachedFromWindow
Android的事件分发可以理解为向下分发,向上回传,类似V字型,V字的左边是事件进行向下分发,如果途中没有进行事件的分发拦截,则事件传递到最底层的View,即是最接近屏幕的View。V字的右边是事件的回传,如果中途没有进行事件的消费,则事件传递到最顶层的View,直至消失。
⑤ Android之自定义控件
一、简单自定义控件MyButton
每一个控岩侍燃件都是一个java类,有对应的代码,只要你能正确的编写java代码,那么电脑培训http://www.kmbdqn.cn/发现可以创造出符合你需求的控件,即自定义控件。
1.通过继承的方式,创建自定义控件
通过继承一个现有的控件,覆盖其界面的呈现
通过继承一个包含若干子控件的布局
通过继承一个现有的控件,覆盖某个响应事件
继承一个View来完整自定义一个心控件
2.使你的自定义控件继承自某个最接近的Android控件,必须是public
一般都会调用父类的构造方法,注意一般有三个构造方法
覆盖原来控件的方法,注意是否要再调用super中的方法
在XML中以类全名的方式引用此控件
二、复杂自定义控件MyLogin
需要设计包含一组控件的自定义控件就需要用到复杂的自定义控件谈脊
1)使得你的自定义控件继承自某个接近的布局
2)正确的实现构造方法:构造方法中实例化目标布局,同时查找到各个子布局
3)添加相应的响应代码来修改属性,使得外部能访问布局中的子控件
4)在XML中以类全粗虚名的方式引用此控件,完整的包名+类名。
⑥ Android 简单自定义TextView
Canvas.drawText(text, x, y, paint) 中的参数y,指的是文字的基线(baseLine)。x 的值并不是最左边的字符的起点,绝大多数的字符,他们的宽度都是要略微大于实际显示的宽度,字符的左右会留出一部分空闲,用于文字之间的间隔,以及文字与边框之间的间隔。
FontMetircs getFontMetrics(),获取 Paint 的 FontMetrics。
FontMetrics 是个相对专业的工具类,它提供了几个文字排印方面的数值:ascent, descent, top, bottom, leading。
baseLine:基线
FontMetrics 提供的就是 Paint 根据当前字体和字号,得出的这些值的推荐值。它把这些值以变量的形式存储,供开发者需要时使用。
另外,ascent 和 descent 这两个值还可以通过 Paint.ascent() 和 Paint.descent() 来快捷获取。
计算baseLine
//计算基线
Paint.FontMetricsInt fontMetricsInt = cmPaint.getFontMetricsInt();
int dy = (fontMetricsInt.bottom - fontMetricsInt.top)/2 - fontMetricsInt.bottom;
int baseLine = getHeight()/2 + dy;
自定义CMTextVeiw:
https://github.com/hualianrensheng/CMViewDemo
文章引用:
Hencoder http://hencoder.com/ui-1-3/
Darren https://www.jianshu.com/p/b272528165a2
⑦ 常用的android开发框架有哪些
主要分为以下几种:
1、volley
项目地址 https://github.com/smanikandan14/Volley-demo
(1) JSON,图像等的异步下载;
(2) 网络请求的排序(scheling)
(3) 网络请求的优先级处理
(4) 缓存
(5) 多级别取消请求
(6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)
2、Android-async-http
项目地址:https://github.com/loopj/android-async-http
文档介绍:http://loopj.com/android-async-http/
(1) 在匿名回调中处理请求结果
(2) 在UI线程外进行http请求
(3) 文件断点上传
(4) 智能重试
(5) 默认gzip压缩
(6) 支持解析成Json格式
(7) 可将Cookies持久化到SharedPreferences
3、Afinal框架
项目地址:https://github.com/yangfuhai/afinal
主要有四大模块:
(1) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。
(3) 网络模块:通过httpclient进行封装http数据请求,支持ajax方式加载,支持下载、上传文件功能。
(4) 图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap的内存管理使用lru算法,
没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android官方文档),
更好的管理bitmap内存。FinalBitmap可以自定义下载器,用来扩展其他协议显示网络图片,比如ftp等。同时可以自定义bitmap显示器,
在imageview显示图片的时候播放动画等(默认是渐变动画显示)。
4、xUtils框架
项目地址:https://github.com/wyouflf/xUtils
主要有四大模块:
(1) 数据库模块:android中的orm框架,一行代码就可以进行增删改查;
支持事务,默认关闭;
可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
支持绑定外键,保存实体时外键关联实体自动保存或更新;
自动加载外键关联实体,支持延时加载;
支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
(3) 网络模块:支持同步,异步方式的请求;
支持大文件上传,上传大文件不会oom;
支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。
(4) 图片缓存模块:加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
支持加载网络图片和本地图片;
内存管理使用lru算法,更好的管理bitmap内存;
可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...
5、ThinkAndroid
项目地址:https://github.com/white-cat/ThinkAndroid
主要有以下模块:
(1) MVC模块:实现视图与模型的分离。
(2) ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
(3) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
(4) http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。
(5) 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置
(6) 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
(7) 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。
(8) 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印
(9) 下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。
(10) 网络状态检测模块:当网络状态改变时,对其进行检
6、LoonAndroid
项目地址:https://github.com/gdpancheng/LoonAndroid
主要有以下模块:
(1) 自动注入框架(只需要继承框架内的application既可)
(2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)
(3) 网络请求模块(继承了基本上现在所有的http请求)
(4) eventbus(集成一个开源的框架)
(5) 验证框架(集成开源框架)
(6) json解析(支持解析成集合或者对象)
(7) 数据库(不知道是哪位写的 忘记了)
(8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向)
(9) 自动更新模块
(10) 一系列工具类
7、KJFrameForAndroid
项目地址:http://git.oschina.net/kymjs/KJFrameForAndroid#git-readme
github项目地址:https://github.com/kymjs/KJFrameForAndroid
备用项目地址:http://git.oschina.net/kymjs/KJFrameForAndroid
KJFrameForAndroid 又叫KJLibrary,是一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用;
KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。我们提倡用最少的代码,完成最多的操作,用最高的效率,完成最复杂的功能。
同时,KJFrameForAndroid是免费的、开源的、简易的、遵循Apache Licence 2.0开源协议发布的android应用开发框架,总共分为五大模 块:UILibrary,UtilsLibrary,HttpLibrary,BitmapLibrary,DBLibrary。
8、AndroidAnnotations
xUtils是国内比较火的快速开发框架,但是它的注解机制不是太稳定而且注解可选也比较少,国外的一个框架主要专注于注解的开发,简化Android代码编写,它除了有依赖注入的特性以外,还集成了Ormlite,Spring-android中的REST模板。使用起来非常方便,大大提高了开发效率。
1.下载AndroidAnnotations:
git官网:https://github.com/excilys/androidannotations
项目中重要的两个jar包分别是:androidannotations-api-3.0.1.jar和androidannotations-3.0.1.jar
2.新建一个android项目,然后将androidannotations-api-3.0.1.jar复制到libs目录下,在项目的根目录新建一个文件夹,命名为compile-libs,然后将androidannotations-3.0.1.jar复制到该目录下
3.在你的工程上右键单击,在弹出的菜单中选择"Properties",找到Java Compiler,确保Compiler compliance level设置为1.6,否则的话处理器将不起作用
4.然后设置项目属性:右键->Properties->Java Compiler->Annotation Processing 在该页面选中Enable project specific settings。
5.转到Java Compiler 中的 Annotation Processing 下边的 Factory Path,在此将androidannotations-3.0.1.jar添加到其中。
注解1:@ViewById 与findViewById功能相似,如果ViewById后没有设置资源ID的话,就是自动查找与变量名称相同的id资源。
注解2:@Click 点击事件处理的注解。
注解3:@UiThread 后台Ui线程的注解,省去了Handler等等。
注解4:@EActivity 提示Activity的注解,注意,该注解将Activity编译成Activity_,注意,多一个下划线“_”,因此在AndroidManifest.xml文件中需要将其添加下滑线
注解5:@AfterViews 是指View类注入完毕之后执行的代码。
⑧ android中自定义注解怎么写
原装的Android标题栏配色比较单调,配模就是黑色的一坨,现简哗在假设你的软件需要独自添加标题栏,这样不仅美观而且可以将进度条等加进去,如何实现拦卖行: 方法一、在你的那张Activity中onCreate方法中加上下面代码: requestWindowFeature(Window.FEATURE_...
⑨ Android监听网络状态框架
就这么简单,让我们开始吧。
看下最终实现的使用:
日志:
好了,新建一个AndroidLibray开始实现。
权限走一波:
首先,咱们需要一个监听网络状态的工具类
在lib中创建一个广播,然后再配置文件里注册一下。
完善下咱们的receiver:
监听接口:
manager:
再加上一个枚举类:
OK,一套正常操作,一个最普通网络监听类写完了。接着咱们尝试用注解,让这个小框架看的有档次些。
完善一下自定义注解:
然后来捋一下思路:
照样是固定三部曲,按照步骤来:
1.先完善我们的注册方法
在这里,我创建了一个方法封装类。比较简单: MethodManager
这里的 mMethodList 是方法封装类(MethodManager)的List,用来存储筛选后的MainActivity中方法,也就是网络监听方法。以下是方法的筛选:
咱们定义一个post方法,去完成这项工作:
这里实现了通过网络监听注解上方的参数,我们可以单独监听某一种网络状态的变化。比如
上方参数表明,只有在WIFI断开和连接的时候,方法才会做出响应。想要所有提示设置为AUTO就行啦。
OK,做完逻辑以后执行一下:
大功告成!跑一下看看效果!
项目地址: https://github.com/CocoYuki/NetListener
是一个练手的小项目,实际网络请求在7.0时就能通过一个CallBack轻松搞定了。