java黄油刀_一篇文章玩转ButterKnife,让代码更简洁

本文详细介绍了Android开发中的ButterKnife库,它通过注解简化了视图绑定和事件处理,减少了繁琐的findViewById和手动设置事件监听器的代码。ButterKnife由知名Android开发者Jake Wharton创建,其优势在于提高开发效率、代码简洁性和可读性。文章列举了ButterKnife在View绑定、资源绑定、非Activity绑定、View List绑定、Listener绑定等方面的使用场景,并提供了各种事件监听的示例代码,包括单击、长按、Checked改变、软键盘按钮、EditText内容改变、焦点变化、触摸事件和item监听。此外,文章还提到了在Android Studio中集成和使用ButterKnife的步骤,以及如何在BaseActivity中封装以进一步简化代码。
摘要由CSDN通过智能技术生成

前言

话说,Android开发的兄弟们都知道,每次初始化控件,设置相应的事件,写的那点过程多而且恶心。我们先一块回顾下不堪的曾经~那些年,我们是这样初始化控件:

// 每次的习惯上来写一个initView()方法

tvContent = (TextView) findViewById(R.id.btn_content);

// 遇到项目大的时候,这里面的东西,也曾占据半壁江山。。。苦不堪言

// 当然也曾封装过方法,避免各种findViewById,但是依旧如此。。。

那些年,我们是这样设置事件:

tvContent.setOnClickListener(this);

// 当然,LZ的习惯依旧扔到initView中,让他们尽情的浪荡,放纵~

But,骚年,身为一个Android开发,你还能继续忍受这种不堪的摧残么?答案当然不能!

那么,接下来为大家带来一个神器,助我们开发高效,快捷~

ButterKnife 初识

ButterKnife,又被戏称为黄油刀,至于为什么被戏称为这个,大家可以看下面附上的从官方截取的icon~

d286465cab6c849f3defe8eb60c3f9b5.png

一块桌布,一个盘子,一个Android小机器人形状的黄油,一把刀。这些合起来被大家戏称为黄油刀。(我说呢,纠结我半天,都搞不懂黄油刀是个什么鬼,这次晓得了)icon下面简单解释就是为Android 视图(View)提供绑定字段和方法。 也就是说,我们今后可以通过这把刀去替换之前琐碎的初始化~

大家有兴趣的也可以去官网上看看,下面为大家附上官网地址以及GitHub地址捎带的附带个api地址。

官方地址:http://jakewharton.github.io/butterknife/

GitHub地址:https://github.com/JakeWharton/butterknife

API访问地址:http://jakewharton.github.io/butterknife/javadoc/

话说,简单了解之后,还是来点干货吧~不然说不过去哈

首先我们要明白,ButterKnife 是出自Android大神JakeWharton之手的一个开源库,它的作用就是通过注解绑定视图的方法,从而简化代码量(减少我们当年findViewById以及设置事件时编写的大量代码)。

而我们使用一个东西,必须要知道他的优势在哪儿?我用它能给我带来什么方便之处?那么接下来,我们看看这把“黄油刀”有着什么样的优势,从而能简化我们一些代码?

ButterKnife 优势

1. 强大的View绑定,Click事件处理功能以及资源内容,简化代码,提升开发效率;

2. 方便的处理Adapter里的ViewHolder绑定问题;

3. 运行时不会影响APP效率,使用配置方便;

4. 代码清晰,可读性强。

了解完ButterKnife优势后,怀着好奇心,我们看看他都支持哪儿些方面,换句话说就是,我们开发过程中,在什么情况下可以通过使用ButterKnife去减少我们曾经的代码量?

ButterKnife 使用场景

View(视图)绑定:例如初始化控件;

资源绑定:例如color,string等;

非Activity绑定:这里值得是当时用 fragment 的时候;

View List 绑定: Adapter 中 ViewHolder,具体使用会在下方讲解;

Listener 绑定:这个就好理解了,也就是平时控件所需监听事件。

ButterKnife 语法

1. activity fragment 绑定与 fragment解绑

想要使用ButterKnife,简单配置之后,我们还需要在Activity中onCreate()绑定,如下:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// 必须在setContentView()之后绑定

ButterKnife.bind(this);

}

而如果使用fragment,官方给出的绑定以及解绑如下:

publicclass FancyFragment extends Fragment {

@BindView(R.id.button1) Button button1;

@BindView(R.id.button2) Button button2;

private Unbinder unbinder;

@Override publicViewonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

Viewview= inflater.inflate(R.layout.fancy_fragment, container,false);

// 绑定

unbinder = ButterKnife.bind(this, view);

// TODO Use fields...

returnview;

}

@Override publicvoid onDestroyView() {

super.onDestroyView();

// 解绑

unbinder.unbind();

}

}

绑定之后,我们一起来看看,常用的几种监听通过使用ButterKnife之后,我们又该如何编写相关事件呢?别急,往下看~

2.单击事件

首先我们先看看人家表层提供我们代码中,我们可以得到哪儿些对我们有用的信息

514b439a0252d8a36f30fce3fa802e70.png

首先明确,targetType(目标类型)为View,setter为setOnClickListener(单击事件监听),type为ButterKnife封装的单击事件(butterknife.internal.DebouncingOnClickListener),而method中则是name为doClick以及parameters为View类型的俩个参数;而下面的interface接口中需要我们传递一个id。

简单了解后,我们衍生出三种写法,如下:

// 写法1

@OnClick(控件ID)

void 方法名() {

//业务逻辑操作

}

// 写法2

@OnClick(控件ID)

void 方法名(控件类型) {

//业务逻辑操作

}

// 写法3

@OnClick(控件ID)

void 方法名(Viewview) {

//业务逻辑操作

}

你可以按照上面指定一个个的写,也可以绑定多个,如官网提供下面写法:

f39920b056825a32b9182897749e216a.png

3.长按事件

同样依旧看人家怎么写的,看看我们能了解到什么

f67a274aa54a284d794487f8f6ff5f42.png

和单击事件对比,长按时间则多出了一个returnType(返回值),且默认为false。So,写法如下~

// 方法1

boolean 方法名(){

// 业务逻辑操作

returnfalse;

}

// 方法2

boolean 方法名(控件类型){

// 业务逻辑操作

returnfalse;

}

// 方法3

boolean 方法名(Viewview){

// 业务逻辑操作

returnfalse;

}

4.Checked改变事件

老规矩:

9d1eb720621742ccd17cfa1900488be0.png

改变,一般来说,会提供我们一个标识,去方便我们根据不同的状态去处理不同的逻辑,so...

// 写法1

@OnCheckedChanged(控件ID)

void radioButtonCheckChange(boolean isl) {

// 业务逻辑

}

// 写法2

@OnCheckedChanged(控件ID)

void radioButtonCheckChange(控件类型,boolean isl) {

// 业务逻辑

}

5.监听软键盘右下角按钮事件

老规矩:

2a6416554ea7d8d90f5c0f227285d95c.png

so...经过上面几个大家可以知道,我们只需要对parameters以及是否是returnType重点关注即可。

// 写法1

@OnEditorAction(控件ID)

boolean 方法名() {

// 业务逻辑操作

returnfalse;

}

// 写法2

// code:状态码

@OnEditorAction(控件ID)

boolean EditTextAction(intcode) {

// 业务逻辑操作

returnfalse;

}

// 写法3

// KeyEvent

@OnEditorAction(控件ID)

boolean EditTextAction(KeyEvent keyEvent) {

// 业务逻辑操作

returnfalse;

}

// 写法4

@OnEditorAction(控件ID)

boolean EditTextAction(intcode, KeyEvent keyEvent) {

// 业务逻辑操作

returnfalse;

}

// 写法5

@OnEditorAction(控件ID)

boolean EditTextAction(TextView textView,intcode, KeyEvent keyEvent) {

// 业务逻辑操作

returnfalse;

}

6. EditText内容改变监听事件

由于源码中内容较长,不方便截图,故截取部分代码做解析,如下:

@Target(METHOD)

@Retention(CLASS)

@ListenerClass(

targetType = "android.widget.TextView",

setter = "addTextChangedListener",

remover = "removeTextChangedListener",

type = "android.text.TextWatcher",--->   这里同样对之前的TextWatcher做了相关处理 ggg

callbacks = OnTextChanged.Callback.class   --->   自定义枚举,通过枚举类型标识当前操作 666

)

public@interface OnTextChanged {

/** ViewIDstowhich the method will be bound. */

@IdRes int[] value()default{View.NO_ID };--->   需要传入ID

/** Listener callback towhich the method will be bound. */

Callback callback() defaultCallback.TEXT_CHANGED;--->  未改变状态

/** {@link TextWatcher} callback methods. */

enum Callback {  --->  枚举中分为三种类似 未改变 改变前 改变后

/** {@link TextWatcher#onTextChanged(CharSequence, int,int,int)} */

@ListenerMethod(

name="onTextChanged",--->  当前标识为 未改变

parameters = {

"java.lang.CharSequence",--->  用户输入字符

"int",--->  改变前个数

"int",--->  测试时,返回0,没整明白代表什么意思

"int"--->  根据打印结果,猜测这个应该是每次增加内容个数

}

)

TEXT_CHANGED,

/** {@link TextWatcher#beforeTextChanged(CharSequence, int,int,int)} */

@ListenerMethod(

name="beforeTextChanged",--->  当前标识为 改变前

parameters = {

"java.lang.CharSequence",--->  用户输入字符

"int",--->  改变前个数

"int",

"int"

}

)

BEFORE_TEXT_CHANGED,

/** {@link TextWatcher#afterTextChanged(android.text.Editable)} */

@ListenerMethod(

name="afterTextChanged",--->  当前标识为 改变后

parameters = "android.text.Editable"--->  用户输入字符

)

AFTER_TEXT_CHANGED, --->  我们关注的重点在此,每次只需要监听这个,去做相关处理即可

}

从上得知,关于EditText内容改变事件,我们关注点只在乎改变后的内容格式(个数)是否符合项目需求,而其他可以暂时忽略,从而衍生下面写法:

// 内容改变后监听

// Editable editable:用户输入字符

@OnTextChanged(value = 控件ID, callback = 监听类型,改变后取值为:OnTextChanged.Callback.AFTER_TEXT_CHANGED)

void editTextChangeAfter(Editable editable) {

// 业务逻辑

}

// 内容改变前监听

@OnTextChanged(value = 控件ID, callback = 监听类型,改变前取值为:OnTextChanged.Callback.BEFORE_TEXT_CHANGED)

void editTextChangeBefore(CharSequence s, intstart) {

// 业务逻辑

}

// 内容未发生改变监听

@OnTextChanged(value = 控件ID, callback = 监听类型,取值为:OnTextChanged.Callback.TEXT_CHANGED)

void editTextChange(CharSequence s, intstart) {

// 业务逻辑

}

7. 焦点监听事件

老规矩:

5d66910b3a03adee69f17875da98a871.png

由此可见,如下:

@OnFocusChange(控件ID)

void editTextFocus(boolean isl){

// 业务逻辑

}

8. 触摸监听事件

老规矩:

74d9ef55a4cd25bc3a3a30ee54e378da.png

写法如下:

@OnTouch(控件ID)

boolean imageView(MotionEvent event){

// 业务逻辑

returnfalse;

}

9. item项单击监听事件

老规矩:

2e57a692edde34aafe840b8430c373ac.png

so...

@OnItemClick(控件ID)

void listItemClick(intposition){

// 业务逻辑

}

10. item项长按监听事件

老规矩:

d51b7be29f5fa111fe26864c6e26511d.png

so...

@OnItemLongClick(R.id.listView)

boolean listItemLongClick(intposition) {

Toast.makeText(this, "OnItemLongClick---点击了第"+ position +"个", Toast.LENGTH_SHORT).show();

returntrue;

}

ButterKnife 使用注意

1.Activity ButterKnife.bind(this) 必须在 setContentView() 之后,且父类 bind 绑定后,子类不需要再 bind;

2.Fragment 中使用需要传入view:Fragment ButterKnife.bind(this, mRootView);

3.属性布局不能用private or static 修饰,否则会报错;

4.setContentView()不能通过注解实现。(其他的有些注解框架可以)

通过上面简单介绍,相信大家对这把刀已经有了一个初步的理解,那么如何在Android Studio中通过使用这把刀从而改善我们的代码呢?我们接着往下瞧。

Android Studio使用ButterKnife前期准备操作

想要在Android Studio中使用ButterKnife,首先需要下载安装ButterKnife插件,之后经过简单配置之后方可使用~

***步:Android Studio集成ButterKnife插件

1.点击 File ---> Settings... ---> 选择 Plugins(也可以使用快捷键 Ctrl+Alt+S)

1ca638f0c3a995d7da897d97b4120685.png

2.输入ButterKnife,选择“Android ButterKnife Zelezny”,点击安装(LZ这里已经安装好了),稍后Android Studio会提示重启AS,确认即可。

21b1dc639a0890ba93f4694092f5e521.png

3.经过以上简单俩步,我们的Android Studio又get了新技能,那就是:支持ButterKnife插件!

第二步:配置ButterKnife

1.使用前,我们需要对ButterKnife进行简单配置( 为我们的项目引入'com.jakewharton:butterknifecompiler:8.5.1','com.jakewharton:butterknife:8.5.1' ),引入过程如下所示:

819ccf9641847e37c4d2d47a8a48f555.png

136f0e39aa2170cb7efde7fb097db289.png

2.引入完成之后,我们先来小试牛刀~得瑟得瑟

在MainActivity中的onCreate 右键layout,选择Generate... ,Generate ButterKnife Injections,选择要使用注解的控件,点击Confirm

723b8c7bce93ca76aa05a7dd49bfdb40.gif

一键可视化操作,方便快捷~进过上面的配置后,我们可以在项目中尽情的使用ButterKnife各种秀了~

刀法一部曲,玩转常用事件监听

1.在MainActivity布局中新增几个常用控件,通过右键layout,选择Generate... ,Generate ButterKnife Injections,选择要使用注解的控件,点击Confirm ,从而生成我们接下来演示根本(后面会有所更改),如下图所示~

062fab49b2e168ed0fff201234fb12f0.png

接下来为大家演示相关事件使用,一点点玩转黄油刀

1. 单击事件(以TextView为例)

代码如下:

@OnClick(R.id.text)

void textClick() {

Toast.makeText(MainActivity.this, "TextView的单击事件触发。。。(无参-默认)", Toast.LENGTH_SHORT).show();

}

@OnClick(R.id.text)

void textClick(TextView textView){

Toast.makeText(MainActivity.this, "TextView的单击事件触发。。。(TextView)", Toast.LENGTH_SHORT).show();

}

@OnClick(R.id.text)

void textClick(Viewview){

Toast.makeText(MainActivity.this, "TextView的单击事件触发。。。(View)", Toast.LENGTH_SHORT).show();

}

运行结果展示:

e4cce848e8ed3d787ef6dc4bcc2a379a.gif

2. 长按事件(以Button为例)

代码如下:

@OnLongClick(R.id.button)

boolean buttonLongClick(){

Toast.makeText(MainActivity.this, "Button的长按事件触发。。。(无参-默认)", Toast.LENGTH_SHORT).show();

returnfalse;

}

//    @OnLongClick(R.id.button)

//    boolean buttonLongClick(Button button){

//        Toast.makeText(MainActivity.this, "Button的长按事件触发。。。(TextView)", Toast.LENGTH_SHORT).show();

//        returnfalse;

//    }

//    @OnLongClick(R.id.button)

//    boolean buttonLongClick(Viewview){

//        Toast.makeText(MainActivity.this, "Button的长按事件触发。。。(View)", Toast.LENGTH_SHORT).show();

//        returnfalse;

//    }

运行结果如下:

c1d8fb73622d1f8443a50d6a224ae54f.gif

这里大家可能会问了,LZ你干嘛要把下面的注释掉了呢,是不是不能用呢?确实,一开始没有注释,运行时候出现异常,提示如下:

Multiple listener methodswithreturnvalue specifiedforID:2131165193

LZ理解为,这个监听只会为ID(2131165193)返回相应监听,也就是一一对应!so... 一山不容二虎,除非一公一母啊~

3. Checked改变事件(以CheckBox为例)

代码如下:

@OnCheckedChanged(R.id.checkBox)

void radioButtonCheckChange(boolean isl) {

Toast.makeText(MainActivity.this, "CheckBox。。。(无参)"+ isl, Toast.LENGTH_SHORT).show();

}

@OnCheckedChanged(R.id.checkBox)

void radioButtonCheckChange(CheckBox checkBox,boolean isl) {

Toast.makeText(MainActivity.this, "CheckBox。。。(CheckBox)"+ isl, Toast.LENGTH_SHORT).show();

}

运行结果如下:

ecc35c9957a89b88afba770b2f379971.gif

4. 监听软键盘右下角按钮事件

代码如下:

//    @OnEditorAction(R.id.tv_editor_action)

//    boolean EditTextAction() {

//        Toast.makeText(MainActivity.this, " 点击---通往天堂 无参", Toast.LENGTH_SHORT).show();

//        returnfalse;

//    }

//    @OnEditorAction(R.id.tv_editor_action)

//    boolean EditTextAction(intcode) {

//        Toast.makeText(MainActivity.this, " 点击---通往天堂 code:"+code, Toast.LENGTH_SHORT).show();

//        returnfalse;

//    }

//    @OnEditorAction(R.id.tv_editor_action)

//    boolean EditTextAction(KeyEvent keyEvent) {

//        Toast.makeText(MainActivity.this, "点击---通往天堂 KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show();

//        returnfalse;

//    }

//    @OnEditorAction(R.id.tv_editor_action)

//    boolean EditTextAction(intcode, KeyEvent keyEvent) {

//        Toast.makeText(MainActivity.this, "点击---通往天堂 code:"+code+" KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show();

//        returnfalse;

//    }

@OnEditorAction(R.id.tv_editor_action)

boolean EditTextAction(TextView textView,intcode, KeyEvent keyEvent) {

Toast.makeText(MainActivity.this, textView.getText().toString()+" 点击---通往天堂 code:"+code+" KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show();

returnfalse;

}

运行效果下:

dbab09c467ff75751f432d163f9bec91.gif

5. EditText内容改变监听事件

代码如下:

@OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)

void editTextChangeAfter(Editable editable) {

Toast.makeText(MainActivity.this, "改变后内容为:"+editable.toString(), Toast.LENGTH_SHORT).show();

System.out.println("改变后---内容为:"+editable.toString());

}

@OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)

void editTextChangeBefore(CharSequence s, intstart,intbefore,intcount) {

Toast.makeText(MainActivity.this, "编辑内容为:"+s+",开始前个数:"+start, Toast.LENGTH_SHORT).show();

System.out.println("改变前---内容为:"+s+",开始前个数:"+start+",:"+before+","+count);

}

@OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.TEXT_CHANGED)

void editTextChange(CharSequence s, intstart,intbefore,intcount) {

Toast.makeText(MainActivity.this, "编辑内容为:"+s+",开始前个数:"+start, Toast.LENGTH_SHORT).show();

System.out.println("未编辑---内容为:"+s+",开始前个数:"+start+","+before+","+count);

}

运行结果如下:

8d410533031658aa0e1a546574455271.png

6.焦点监听事件

代码如下:

@OnFocusChange(R.id.editTextFocus)

void editTextFocus(boolean isl) {

if (isl) {

Toast.makeText(MainActivity.this, "获取焦点"+ isl, Toast.LENGTH_SHORT).show();

} else{

Toast.makeText(MainActivity.this, "失去焦点"+ isl, Toast.LENGTH_SHORT).show();

}

}

运行结果如下:

fb681c563f2aaff994dacdd9e431cd76.gif

7. 触摸监听事件

代码如下:

@OnTouch(R.id.imageView)

boolean imageView(MotionEvent event){

System.out.println(event);

returnfalse;

}

运行结果如下:

04-10 11:47:04.504 32627-32627/cn.hlq.butterknifestudyI/System.out: MotionEvent {action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=189.8265, y[0]=148.42676, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=6743683, downTime=6743683, deviceId=1, source=0x1002 }

8. item单击以及长按监听事件

代码如下:

@OnItemClick(R.id.listView)

void listItemClick(intposition){

Toast.makeText(this,"OnItemClick---点击了第"+position+"个",Toast.LENGTH_SHORT).show();

}

@OnItemLongClick(R.id.listView)

boolean listItemLongClick(intposition) {

Toast.makeText(this, "OnItemLongClick---点击了第"+ position +"个", Toast.LENGTH_SHORT).show();

returntrue;

}

运行结果如下:

7389cadd1454e237081b1bf2ed0def0c.gif

想必大家通过以上已经掌握这套刀法基本使用了,那么上面曾说过,还可以对Adapter进行改造,从而节省开发过程中一些编码,那就一块瞅瞅呗~

刀法二部曲,巧用Adapter

创建一个item_layout作为接下来演示用~

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal">

android:id="@+id/item_username"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical"

android:layout_weight="1"/>

android:id="@+id/item_userPwd"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical"

android:layout_weight="1"/>

很简单,没什么东西,接下来看adapter~

package cn.hlq.butterknifestudy.adapter;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.TextView;

import java.util.ArrayList;

import java.util.List;

import butterknife.BindView;

import butterknife.ButterKnife;

import cn.hlq.butterknifestudy.R;

import cn.hlq.butterknifestudy.model.Student;

/**

* Created byHLQon2017/4/11 0011.

*/

publicclass ListViewAdapter extends BaseAdapter {

private Context context;

private List stuList = new ArrayList();

publicListViewAdapter(Context context, List stuList) {

this.context = context;

this.stuList = stuList;

}

@Override

publicintgetCount() {

returnstuList !=null? stuList.size() : 0;

}

@Override

publicObject getItem(intposition) {

returnstuList !=null? stuList.get(position) :null;

}

@Override

publiclong getItemId(intposition) {

returnposition;

}

@Override

publicViewgetView(intposition,ViewconvertView, ViewGroup parent) {

ViewHolder viewHolder = null;

if (viewHolder == null) {

convertView = LayoutInflater.from(context).inflate(R.layout.item_listview_show,null);

viewHolder = new ViewHolder(convertView);

convertView.setTag(viewHolder);

} else{

viewHolder = (ViewHolder) convertView.getTag();

}

Student stu = stuList.get(position);

viewHolder.itemUsername.setText(stu.getUserName());

viewHolder.itemUserPwd.setText(stu.getUserPwd());

returnconvertView;

}

staticclass ViewHolder {

@BindView(R.id.item_username)

TextView itemUsername;

@BindView(R.id.item_userPwd)

TextView itemUserPwd;

ViewHolder(Viewview) {

ButterKnife.bind(this, view);

}

}

}

运行结果为:

3ecab36ca45441b41e5834a3d7da90e1.png

在此告诉大家一个小秘密,你可以直接右键layout,在生成注解时,选择自动创建ViewHolder,如下图:

b69752e299e7b804e3b5ace56f36b049.png

是不是相当方便?在此,顺便捎带脚的介绍下,如何使用这把刀玩玩资源内容呢?

// 初始化指定默认值

@BindString(R.string.app_test)

String titleContent;

lvTitle.setText(titleContent);

运行结果如下:

30d7c3e73e25ed2d230a27dd1f5f2783.png

除以上,刀法中还包含对以下支持,大家有兴趣自己了解即可,没什么难度了

4b297722345e809be4fd0a142bde8d4e.png

而且官方上也提供了一些基本的使用,如下:

222aa9349ebfc5d915f8e86e9298b047.png

刀法三部曲BaseActivity封装,进一步简化代码

通常我们会封装一个BaseActivity,里面写好常用内容,之后activity继承此BaseActivity。同样我们也可以在此进行初始化,避免我们多次初始化,看下面一波代码~

package com.heliquan.butterknife.base;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.support.annotation.LayoutRes;

import android.view.KeyEvent;

import android.view.View;

import android.view.ViewGroup;

import butterknife.ButterKnife;

import butterknife.Unbinder;

/**

* created byheliquanat2017年4月14日

*/

publicabstract class BaseActivity extends Activity {

private Unbinder unbinder;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 必须重写setContentView()的三个方法,不然会出现子类继承无效,具体原因没有深入了解

setContentView(getContentViewId());

unbinder = ButterKnife.bind(this);

}

@Override

publicvoid setContentView(@LayoutResintlayoutResID) {

super.setContentView(layoutResID);

unbinder = ButterKnife.bind(this);

}

@Override

publicvoid setContentView(Viewview) {

super.setContentView(view);

unbinder = ButterKnife.bind(this);

}

@Override

publicvoid setContentView(Viewview, ViewGroup.LayoutParams params) {

super.setContentView(view, params);

unbinder = ButterKnife.bind(this);

}

/**

* 获取内容id

*/

protected abstract intgetContentViewId();

/**

* 初始化View

*/

protected abstract void initView();

@Override

protected void onDestroy() {

super.onDestroy();

unbinder.unbind();

}

/**

* 根据id返回资源内容

*

* @param context

* @param strId

* @return

*/

protected String getStrResource(Activity activity, intstrId) {

returnactivity.getResources().getString(strId);

}

/**

* 监听返回按钮,点击返回finish当前页面

*

* @param keyCode

* @param event

* @return

*/

@Override

publicboolean onKeyDown(intkeyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

finish();

returntrue;

}

returnsuper.onKeyDown(keyCode, event);

}

}

结束语

看到这里,想必大家已经基本对这套刀法有所了解以及能够基本运用了,感谢大家观看,如有不到之处,欢迎交流~

【编辑推荐】

【责任编辑:枯木 TEL:(010)68476606】

点赞 0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值