Android--Butter Knife

2024-04-08 07:32
文章标签 android butter knife

本文主要是介绍Android--Butter Knife,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

github:https://github.com/JakeWharton/butterknife;
使用指南:http://jakewharton.github.io/butterknife/

ButterKnife 优势:
1.强大的View绑定和Click事件处理功能
2.方便的处理Adapter里的ViewHolder绑定问题

使用心得:
1.Activity 中ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind;
2.Fragment ButterKnife.bind(this, rootView);
3.属性不能用private or static 修饰,否则会报错

一:配置:
app–build.gradle

apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile 'com.jakewharton:butterknife:8.0.1'
apt 'com.jakewharton:butterknife-compiler:8.0.1'
}

gradle–build.gradle

dependencies {classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

二:使用:

text = (TextView) findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {}
});

可以写成:

@BindView(R.id.text)
TextView text;
@OnClick({R.id.text})
void Click() {Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}
public class MainActivity extends AppCompatActivity {
@BindView(R.id.text)TextView text;@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
text = (TextView) findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {}});
}@OnClick({R.id.text})
void Click() {Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}
}

目前是简单体验一下,接下来,我们讲解更多的使用方法:
1–Base:
ButterKnife.bind(this)需要与Activity绑定到一起,而绑定Activity 必须在setContentView之后:

public abstract class BaseActivity extends AppCompatActivity {
public abstract int getContentViewId();private Unbinder unbinder;@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
unbinder = ButterKnife.bind(this);
initViews(savedInstanceState);
}protected abstract void initViews(Bundle bundle);/*** 解除绑定*/
@Override
protected void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
}
public abstract class BaseFragment extends Fragment {
public abstract int getContentViewId();protected Context context;protected View rootView;private Unbinder unbinder;@Nullable@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(getContentViewId(), container, false);
unbinder = ButterKnife.bind(this, rootView);this.context = getActivity();
initViews(savedInstanceState);return rootView;
}protected abstract void initViews(Bundle bundle);@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}

2–View:

@BindView(R.id.text)
TextView text;@BindView(R.id.button)
Button button;

3–资源

@BindString(R.string.app_name)  
String appName;//sting  
@BindColor(R.color.red)  
int textColor;//颜色  
@BindDrawable(R.mipmap.ic_launcher)  
Drawable drawable;//drawble  
@Bind(R.id.imageview)  
ImageView mImageView;  
@Bind(R.id.checkbox)  
CheckBox mCheckBox;  
@BindDrawable(R.drawable.selector_image)  
Drawable selector;  

4–ViewHolder:
—-减少更多重复代码:

public class MyAdapter extends BaseAdapter {@Override public View getView(int position, View view, ViewGroup parent) {ViewHolder holder;if (view != null) {holder = (ViewHolder) view.getTag();} else {view = inflater.inflate(R.layout.whatever, parent, false);//此处为节省代码holder = new ViewHolder(view);view.setTag(holder);}holder.name.setText("John Doe");return view;}staticclassViewHolder{
@BindView(R.id.title) 
TextView name;
@BindView(R.id.job_title)
TextView jobTitle;
publicViewHolder(View view){ButterKnife.bind(this, view);
}
}

5–绑定View集合:

@BindViews ({R.id.button,R.id.button2,R.id.button3})
List<Button> button;

6–批量处理事件:
—-批量处理View事件

ButterKnife.apply(button);
ButterKnife.apply(button, ENABLED,false);
ButterKnife.apply(button, View.ALPHA, 0.0f);

—设置统一处理:

static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
@Override
public void apply(View view, int index) {view.setEnabled(false);
}
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
@Override
public void set(View view, Boolean value, int index) {view.setEnabled(value);
}
};

7–View事件的监听:
–1:监听器参数可选

@OnClick({R.id.button})
void Click() {Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}
--2:
@OnClick({R.id.button})
void Click(View view) {
switch (view.getId()) {
case R.id.button:Toast.makeText(this, "text", Toast.LENGTH_LONG).show();break;
}}

–3:定义一个类型,自动转换:

@OnClick({R.id.button})
void Click(Button btn) {btn.setText("onClick");
Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}

–4:继承View,也可使用监听:
—-自定义View,可以不指定ID,绑定自己的监听

public class CommitButton extends Button {public CommitButton(Context context) {super(context);}public CommitButton(Context context, AttributeSet attrs) {super(context, attrs);}public CommitButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@OnClickvoid click(){}
}

三:空处理:
—-默认情况下,“绑定”和“监听”绑定都是必需的。如果不能找到目标视图,则将抛出异常。

@Nullable
@BindView(R.id.button)
Button button;
而针对事件监听处理:
@Optional
@OnClick(R.id.button)
void Click() {Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}

四:添加多回调方法的监听的使用方法,利用指定回调,实现想回调的方法
–1:listView:

@OnItemClick(value=R.id.listView)
void onItemSelected() {}@OnItemLongClick()
void onItemLongClick(ListView listView){}

–2:EditText

@BindView(R.id.edit)
EditText edit;
@OnTextChanged(value = R.id.edit, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)
void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@OnTextChanged(value = R.id.edit, callback = OnTextChanged.Callback.TEXT_CHANGED)
void onTextChanged(CharSequence s, int start, int before, int count) {}
@OnTextChanged(value = R.id.edit, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void afterTextChanged(Editable s) {}

以下是源码:可以看出,我们在正常使用某个方法的时候,系统都会提供和原生一样的参数供我们使用,所以,可以了解到我们在使用方法时,参数可以保持和原生方法参数一致并使用(其他控件方法也适用):

@Target(METHOD)
@Retention(CLASS)
@ListenerClass(targetType = "android.widget.TextView",setter = "addTextChangedListener",type = "android.text.TextWatcher",callbacks = OnTextChanged.Callback.class
)
public @interface OnTextChanged {@IdRes int[] value() default { View.NO_ID };Callback callback() default Callback.TEXT_CHANGED;enum Callback {@ListenerMethod(name = "onTextChanged",parameters = {"java.lang.CharSequence","int","int","int"})TEXT_CHANGED,@ListenerMethod(name = "beforeTextChanged",parameters = {"java.lang.CharSequence","int","int","int"})BEFORE_TEXT_CHANGED,@ListenerMethod(name = "afterTextChanged",parameters = "android.text.Editable")AFTER_TEXT_CHANGED,}
}

五:在使用整体View,或者Dialog使用:符合使用场景:

View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);

完结:

这篇关于Android--Butter Knife的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884942

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。