ButterKnife

是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。

地址

https://github.com/JakeWharton/butterknife

下载

android {
  ...
  // Butterknife requires Java 8.
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  implementation 'com.jakewharton:butterknife:10.2.3'
  annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
}

Activity使用

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.tv_title)
    TextView mTitle;

    @BindView(R.id.btn_click)
    Button mClick;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //how to bind
        ButterKnife.bind(this);
        //how to use
        mTitle.setTextColor(this.getColor(R.color.purple_700));
    }

    @OnClick(R.id.btn_click)
    public void onHello() {
        Toast.makeText(this,"Click me for 1 tiem",Toast.LENGTH_SHORT).show();
    }
}

Fragment使用

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();  
    }  
}  

Adapter ViewHolder使用

static class ViewHolder {  
    @BindView(R.id.title) 
    TextView name;  
    @BindView(R.id.job) 
    TextView job;  

    public ViewHolder(View view) {  
      ButterKnife.bind(this, view);  
    }  
} 

注解使用用例

绑定注解

@BindView—->绑定一个view;id为一个view 变量

@BindViews —-> 绑定多个view;id为一个view的list变量

@BindArray—-> 绑定string里面array数组;@BindArray(R.array.city ) String[] citys ;

@BindBitmap—->绑定图片资源为Bitmap;@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;

@BindBool —->绑定boolean值

@BindColor —->绑定color;@BindColor(R.color.colorAccent) int black;

@BindDimen —->绑定Dimen;@BindDimen(R.dimen.borth_width) int mBorderWidth;

@BindDrawable —-> 绑定Drawable;@BindDrawable(R.drawable.test_pic) Drawable mTestPic;

@BindFloat —->绑定float

@BindInt —->绑定int

@BindString —->绑定一个String id为一个String变量;@BindString( R.string.app_name ) String meg;

事件注解

@OnClick—->点击事件

@OnCheckedChanged —->选中,取消选中

@OnEditorAction —->软键盘的功能键

@OnFocusChange —->焦点改变

@OnItemClick item—->被点击(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)

@OnItemLongClick item—->长按(返回真可以拦截onItemClick)

@OnItemSelected —->item被选择事件

@OnLongClick —->长按事件

@OnPageChange —->页面改变事件

@OnTextChanged —->EditText里面的文本变化事件

@OnTouch —->触摸事件

@Optional —->选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标View存在,则注入, 不存在,则什么事情都不做

参考

https://blog.csdn.net/donkor_/article/details/77879630

ViewBinding

View Binding是Android Studio 3.6推出的新特性,目的是为了替代findViewById(内部实现还是使用findViewById)。。在启动视图绑定后,系统会为改模块中的每个xml文件生成一个绑定类,绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

官方文档

https://developer.android.google.cn/topic/libraries/view-binding

启用说明

viewBinding 元素添加到其 build.gradle 文件中

android {
        ...
        viewBinding {
            enabled = true
        }
    }

如果您希望在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore=“true” 属性添加到相应布局文件的根视图中

<LinearLayout
            ...
            tools:viewBindingIgnore="true" >
        ...
    </LinearLayout>
    

Activity使用说明

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        
        //视图绑定
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
        
        //tvTitle 为TextView的id
        binding.tvTitle.setText("hello hello hello");
        //btnClick 为Button的id
        binding.btnClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"Click me for 1 tiem",Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Fragment使用说明

Fragment 的存在时间比其视图长。请务必在 Fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用

    private ResultProfileBinding binding;

    @Override
    public View onCreateView (LayoutInflater inflater,
                              ViewGroup container,
                              Bundle savedInstanceState) {
        binding = ResultProfileBinding.inflate(inflater, container, false);
        View view = binding.getRoot();
        return view;
    }
	
	@Override
	public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    	super.onViewCreated(view, savedInstanceState);
        
    	binding.textView.setText("这是Fragment");
    	binding.button.setOnClickListener(new View.OnClickListener() {
        	@Override
        	public void onClick(View view) {
            	Log.d("Fragment", "点击了按钮");
        	}
    	});
	}

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }    

参考

https://www.jianshu.com/p/66728b95baaa

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐