这篇文章主要围绕Android:为什么我们需要使用R2代替R和butterknife?展开,旨在为您提供一份详细的参考资料。我们将全面介绍Android:为什么我们需要使用R2代替R和butterkn
这篇文章主要围绕Android:为什么我们需要使用R2代替R和butterknife?展开,旨在为您提供一份详细的参考资料。我们将全面介绍Android:为什么我们需要使用R2代替R和butterknife?,同时也会为您带来Android Butter Knife 框架、Android butterknife click 事件全部失效问题、Android ButterKnife Zelezny、Android Butterknife 注入框架的实用方法。
本文目录一览:- Android:为什么我们需要使用R2代替R和butterknife?
- Android Butter Knife 框架
- Android butterknife click 事件全部失效问题
- Android ButterKnife Zelezny
- Android Butterknife 注入框架
Android:为什么我们需要使用R2代替R和butterknife?
Now make sure you use R2 instead of R inside all Butter Knife
annotations.
这是为什么?我一直在使用R,一切都很完美.
解决方法
https://github.com/JakeWharton/butterknife#library-projects
这与事实有关,即当作为库的一部分构建时,R.java生成的类中的值不会被声明为“final”.用于@BindView()的注释需要这些R.值是最终的,以后不会更改.
我相信有人可以更好地解释所有这些 – 但最重要的是 – 你可以使用“R”. Android应用程序中@BindView中的值
Android Butter Knife 框架
Android Butter Knife 在项目中的配置及插件安装请见 AS 中安装插件及常用插件
ButterKnife 的优势
- 避免过多的 findViewById 的操作,直接对 view 进行注解绑定点击事件
- 因为是编译期的注解,在运行时不会影响 App 的效率,使用配置方便
- 方便的处理 Adapter 里的 ViewHolder 绑定问题
- 可以简化代码书写,逻辑清晰
ButterKnife 的使用
由于每次在 Acitivity 中都要进行 ButterKnife 的 bind 操作,所以建议将 bind 操作写到 BaseActivity 中,绑定 Activity 必须在 setContentView 之后,代码如下:
public abstract class BaseActivity extends Activity {
private Unbinder unbinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentView());
unbinder = ButterKnife.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
protected abstract int getContentView();
}
而其他 Activity 只需继承 BaseActivity,实现 getContentView 方法,在 getContentView 返回 Activity 的布局文件即可。
具体使用方法可参看 Android Butter Knife 框架 —— 最好用的 View 注入
ButterKnife 使用心得
- ButterKnife.bind () 的调用在 Activity 中必须在 setContentView 之后
- 属性布局不能用 private or static 修饰,否则会报错
- 可以写一个 BaseActivity 来调用 ButterKnife.bind () 方法,子类则不需要再进行 bind 操作
- 在 8.4 中 ButterKnife 移除了 unBind 方法,使用 ButterKnife.bind (this) 返回一个 Unbinder 的引用,通过 Unbinder 的 unbind () 方法进行解除绑定
参考连接:
http://https://www.jianshu.com/p/9ad21e548b69
https://www.jianshu.com/p/83919fca8d84
Android butterknife click 事件全部失效问题
问题:APP 突然所有使用 butterknife 的 @onClick 方式实现的按钮点击事件均失效
解决:查看 butterknife 源代码的 DebouncingOnClickListener 类
public abstract class DebouncingOnClickListener implements View.OnClickListener {
static boolean enabled = true;
private static final Runnable ENABLE_AGAIN = new Runnable() {
@Override public void run() {
enabled = true;
}
};
@Override public final void onClick(View v) {
if (enabled) {
enabled = false;
v.post(ENABLE_AGAIN);
doClick(v);
}
}
public abstract void doClick(View v);
}
我们注意到 v.post (ENABLE_AGAIN),view.post 方法在 7.0 后做了修改,系统不能保证 post 的内容一定会被执行,详情可参考 https://blog.csdn.net/xavier__s/article/details/50260981,这就导致了 enabled 永远不会被置为 true 了,从而所以使用这种方式响应的点击事件都无法执行。具体到自己项目中的情况是在 Activity 启动后 handler.post 了一个 runnable,里面调用了一个 view 的 performClick,而在 Activity 被销毁时没有 remove 这个 runnable,导致 view 已经 detach 了,进而 view.post 无法被执行。
所以建议以后的点击事件不要使用 @OnClick 的方式来做了。
Android ButterKnife Zelezny
参考地址:https://github.com/avast/android-butterknife-zelezny
1)下载插件:Preferences → Plugins → Browse repositories
and search for ButterKnife Zelezny
如下图所示:
2)重启studio,在build.gradle 中配置compile ''com.jakewharton:butterknife:6.1.0''
3) 在setContentView()布局xml上右键点击Generate,选择ButterKnife即可。
如下图:
Android Butterknife 注入框架
简介
ButterKnife是一个专注于Android系统的View注入框架,当一个布局十分复杂时,需要引入执行大量的findViewById代码来找到View的对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。
ButterKnife的优势
- 强大的View绑定事件和资源文件的绑定
- 使用的便捷性上,剔除了原始绑定时候的复杂性
- 由于大多数的注解都是在编译期,所以不会影响程序运行的效率
- 代码清晰,可读性相对来说要强很多
github 地址: https://github.com/JakeWharton/butterknife
如何使用?
在Android Studio 项目中配置ButterKnife
1.在Project的 build.gradle 中添加如下代码:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath ''com.android.tools.build:gradle:3.2.1''
//添加如下代码
classpath ''com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2''
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
2.在App的 build.gradle 中添加如下代码:
apply plugin: ''com.android.application''
apply plugin: ''com.jakewharton.butterknife''//添加这一行
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.hejun.loader"
minSdkVersion 26
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
}
}
}
dependencies {
implementation fileTree(dir: ''libs'', include: [''*.jar''])
implementation ''com.android.support:appcompat-v7:28.0.0''
implementation ''com.android.support.constraint:constraint-layout:1.1.3''
testImplementation ''junit:junit:4.12''
androidTestImplementation ''com.android.support.test:runner:1.0.2''
androidTestImplementation ''com.android.support.test.espresso:espresso-core:3.0.2''
implementation ''com.jakewharton:butterknife:9.0.0-rc2''
annotationProcessor ''com.jakewharton:butterknife-compiler:9.0.0-rc2''//添加这一行
}
ButterKnife插件的添加:可以快速绑定
File -> Settings -> Plugins -> 搜索ButterKnife,找到Android ButterKnife Zeleany进行安装重启AndroidStudio
插件的使用:在布局资源上右键点击,如下图
选中需要绑定的view ,点击confim会自动生成代码
ButterKnife的注解类型
1.绑定注解,视图,资源等等
2.绑定事件
注意:在使用Butterknife 是要 绑定Butterknife .如下
1.在activity中绑定
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定初始化ButterKnife
ButterKnife.bind(this);
}
}
2.在Fragment中绑定
Fragment的生命周期不同于activity。在onCreateView中绑定一个Fragment时,在onDestroyView中将视图设置为null。当你调用bind来为你绑定一个Fragment时,Butter Knife会返回一个Unbinder的实例。在适当的生命周期(onDestroyView)回调中调用它的unbind方法进行Fragment解绑。使用ButterKnife.bind(this, view)进行绑定。
public class ButterknifeFragment extends Fragment{
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
//返回一个Unbinder值(进行解绑),注意这里的this不能使用getActivity()
unbinder = ButterKnife.bind(this, view);
return view;
}
/**
* onDestroyView中进行解绑操作
*/
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
3.在Adapter中绑定
在Adapter的ViewHolder中使用,将ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去。使用ButterKnife.bind(this, view)进行绑定
class Adapter extends BaseAdapter {
private Context context;
private List<Userbean> users = new ArrayList<>();
public Adapter(Context context) {
this.context = context;
}
public void addUsers(List<Userbean> userList) {
users.addAll(userList);
notifyDataSetChanged();
}
@Override
public int getCount() {
return users.size();
}
@Override
public Userbean getItem(int position) {
return users.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Userbean userbean = users.get(position);
viewHolder.name.setText(userbean.getName());
viewHolder.password.setText(userbean.getPassword());
return convertView;
}
class ViewHolder {
@BindView(R.id.name)
TextView name;
@BindView(R.id.password)
TextView password;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
关于Android:为什么我们需要使用R2代替R和butterknife?的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Android Butter Knife 框架、Android butterknife click 事件全部失效问题、Android ButterKnife Zelezny、Android Butterknife 注入框架等相关内容,可以在本站寻找。
本文标签: