标签

Android 44

Android Network security configuration Android 网络配置 Android Camera Preview gradlew 源码分析 Android 动态修改菜单 Android RelativeLayout 之 Gravity 的使用 Android Studio Gradle Download Error Android加载子View 【转】Android打开与关闭软键盘 Android EditText软键盘显示隐藏以及“监听” Android mipmap文件夹 Android 用命令行更新SDK Android Service学习之AIDL, Parcelable和远程服务 Android 5.0设备中,Notification小图标是白色的 Android最佳实践 Android Keystore 文件的密码修改 Android Studio 中加载so库文件 Android 中方法重载遇到的问题 ListView & RecyclerView Google Volley如何缓存HTTP请求文件 Creating logs in Android applications Advanced Android TextView TextView高亮URL地址解析 TextView 高亮URL地址,并实现跳转 Best practices in Android development Android Sdk Manager无法更新问题解决办法 Android ViewPager滑动事件 Google Volley 网络请求框架(一) Andorid UI注入工具的使用(ButterKnife) Android 项目中出现的奇葩bug, 数据NullPointExcption Android Drawable Animation Android 图片的毛玻璃效果 Android之使用Log打印日志 使用Fidder来拦截Android发送的HTTP请求 Android之Webview使用 Android之Notification的使用(二) Android之Notification的使用(一) Android Keyboard Show&Hiden Android 粘贴板的使用 Android中使用.9.png 使用Fidder来拦截Android发送的HTTP请求 Andorid JUnit 单元测试 Activity之间的切换动画 Android ListView中Adapter的使用

Andorid UI注入工具的使用(ButterKnife)

2014年11月04日

一个Android项目中,必不可少有很多UI,并且Activity要控制这些UI,当然,我们会用到以下代码:

// 获取View的引用
Button mBtn = (Button) this.findViewById(R.id.btn);
// 给Button添加事件
mBtn.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        // TODO 做一些你自己要做的事情 
    }
})

每一个Activity都要做类似的事情,这是一个相当蛋疼的事情。

如果你可以像如下代码来实现View的初始画以及事件监听以及其它的,你还会用以前的代码么?

代码如下:

@InjectView(R.id.user) EditText username;
@InjectView(R.id.pass) EditText password;
@OnClick(R.id.submit) void submit() {
    // TODO 实现submit这个Btn的点击事件
}

用上面的注解会更加简单的组织我们的代码结构,代码量更少。 在这里我使用Butter Knife

使用步骤

  1. 去GitHub下载ButterKnife的源码或者jar包 –> 传送门
  2. 在这里,我是去下载的jar包,将jar包添加到项目的libs文件夹下面就可以使用了

先上代码,一个很简单的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/hello_world" />
    
    <Button 
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Change Text"/>

</LinearLayout>

简单到不能在简单的布局了,一个TextView, 一个Button

看Activity的代码,如下:

public class MainActivity extends Activity {

	@InjectView(R.id.tv) TextView mShowTv;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ButterKnife.inject(this);
		mShowTv.setText("Default Text");
	}
	@OnClick(R.id.btn) void changeText() {
		mShowTv.setText("Change Text:" + System.currentTimeMillis());
	}
	
}

就是这么简单的代码,可是就是用不起来,怎么破,在

mShowTv.setText("Default Text")

这儿报了一个空指针。如下图:

Alt text

解决办法

因为使用注解,编译的时候,要进行相应的设置,才可以正常的编译,步骤如下:

右键项目,选择Properities,然后选择Java Compiler下的Annotation Processing。 可是我找了半天,也没有找到它的踪影。不要着急,更新一下Eclipse Java Development Tools就可以了

Install Eclipse Java Development Tools

等到安装完成过后,你就可以进行如下设置了:

Step 01

Step 02

Step 03

Step 04

参考资料



友情链接: Hiro's Blog | Junjun's Blog