第一部分、 ButterKnife 相关
一、环境配置
AndroidStudio环境下,首先安装插件Android ButterKnife Zelezny。
然后,在build.gradle添加依赖:
dependencies{
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
二、ButterKnife的注册与绑定
1、ButterKnife使用心得与注意事项
这部分引用于参考链接,见文末。
1、在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。
2、在非Activity 类(eg:Fragment、ViewHold)中绑定: ButterKnife.bind(this,view);这里的this不能替换成getActivity()。
3、在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。
4、使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。错误: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
5、setContentView()不能通过注解实现。(其他的有些注解框架可以)
6、使用Activity为根视图绑定任意对象时,如果你使用类似MVC的设计模式你可以在Activity 调用ButterKnife.bind(this, activity),来绑定Controller。
7、使用ButterKnife.bind(this,view)绑定一个view的子节点字段。如果你在子View的布局里或者自定义view的构造方法里 使用了inflate,你可以立刻调用此方法。或者,从XML inflate来的自定义view类型可以在onFinishInflate回调方法中使用它。
2、Activity绑定ButterKnife
2.1 绑定前调用ButterKnife.bind(this)
由于每次都要在Activity中的onCreate绑定Activity,所以个人建议写一个BaseActivity完成绑定,子类继承即可。绑定Activity 必须在setContentView之后。使用ButterKnife.bind(this)进行绑定。代码如下:
//基类
public abstract class BaseActivity extends AppCompatActivity {
private MyBaseActiviy_Broad mBaseActiviy_Broad;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置全屏和软件盘遮挡问题
//requestWindowFeature(Window.FEATURE_NO_TITLE);
//getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
setContentView(getLayoutId());
}
protected abstract int getLayoutId();
}
//子类
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定初始化ButterKnife
ButterKnife.bind(this);
}
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
}
2.2 操作方法
右键点击布局文件,选择Generate->Generate Butterknife Injections。即可配置各个控件对应的对象以及点击事件处理函数。
操作后效果如下:
@BindView(R.id.iv_instruction_manual)
ImageView ivInstructionManual;
@BindView(R.id.iv_weather)
ImageView ivWeather;
@BindView(R.id.iv_info)
ImageView ivInfo;
@OnClick({R.id.tv_title, R.id.id_circle_menu_item_center})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tv_title:
break;
case R.id.id_circle_menu_item_center:
break;
}
}
3、Fragment绑定BufferKnife
在OnCreateView里进行绑定,在OnDestroyView里解绑。
//基类
public abstract class BaseFragment extends Fragment {
public Context mContext;
private View view;// 缓存Fragment view
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(getLayoutId(), container, false);
}
mContext = getActivity();
//缓存的rootView需要判断是否已经被加过parent,如果有parent需要从parent删除,要不然会发生这个rootView已经有parent的错误。
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
return view;
}
protected abstract int getLayoutId();
//...省略
}
//子类
public class NodeFragment extends BaseFragment {
private Unbinder unbinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(getLayoutId(), container, false);
unbinder = ButterKnife.bind(this, rootView); //绑定
return rootView;
}
protected int getLayoutId() {
return R.layout.node_layout;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind(); //解绑
}
//...省略
}
操作方法跟Activity里一样。
第二部分、JSON内容自动化生成JAVA类
一、环境配置
Android Studio下,首先安装GsonFormat插件。
二、操作方法
1、 先生成一个TestJson.java的类文件,内容如下:
package com.sprocomm.intelligentirrigation.json;
/**
* Created by hm on 2019/6/21.
*/
public class TestJson {
}
2、在TestJson.java文件内点击右键,选择Generate->GsonFormat,出现设置框,再在其内填入服务器返回的Json数据,最后点击确定。
比如服务器返回数据如下:
{
"success": true,
"result": {
"plan_rows": [
{
"confirm_isdone": 1,
"is_done": 1,
"deadline_warning_status": 0,
"cpgid": "820c8068-695c-11e9-9af2-0242bc1e400b"
},
{
"confirm_isdone": 0,
"is_done": 0,
"deadline_warning_status": 0,
"cpgid": "820ee52e-695c-11e9-9af2-0242bc1e400b"
}
],
"current_date": "2019-06-21"
}
}
把上面的内容填充到GsonFormat框后,
生成的TestJson.java类内容为:
public class TestJson {
/**
* success : true
* result : {"plan_rows":[{"confirm_isdone":1,"is_done":1,"deadline_warning_status":0,"cpgid":"820c8068-695c-11e9-9af2-0242bc1e400b"},{"confirm_isdone":0,"is_done":0,"deadline_warning_status":0,"cpgid":"820ee52e-695c-11e9-9af2-0242bc1e400b"}],"current_date":"2019-06-21"}
*/
private boolean success;
private ResultBean result;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public ResultBean getResult() {
return result;
}
public void setResult(ResultBean result) {
this.result = result;
}
public static class ResultBean {
/**
* plan_rows : [{"confirm_isdone":1,"is_done":1,"deadline_warning_status":0,"cpgid":"820c8068-695c-11e9-9af2-0242bc1e400b"},{"confirm_isdone":0,"is_done":0,"deadline_warning_status":0,"cpgid":"820ee52e-695c-11e9-9af2-0242bc1e400b"}]
* current_date : 2019-06-21
*/
private String current_date;
private List<PlanRowsBean> plan_rows;
public String getCurrent_date() {
return current_date;
}
public void setCurrent_date(String current_date) {
this.current_date = current_date;
}
public List<PlanRowsBean> getPlan_rows() {
return plan_rows;
}
public void setPlan_rows(List<PlanRowsBean> plan_rows) {
this.plan_rows = plan_rows;
}
public static class PlanRowsBean {
/**
* confirm_isdone : 1
* is_done : 1
* deadline_warning_status : 0
* cpgid : 820c8068-695c-11e9-9af2-0242bc1e400b
*/
private int confirm_isdone;
private int is_done;
private int deadline_warning_status;
private String cpgid;
public int getConfirm_isdone() {
return confirm_isdone;
}
public void setConfirm_isdone(int confirm_isdone) {
this.confirm_isdone = confirm_isdone;
}
public int getIs_done() {
return is_done;
}
public void setIs_done(int is_done) {
this.is_done = is_done;
}
public int getDeadline_warning_status() {
return deadline_warning_status;
}
public void setDeadline_warning_status(int deadline_warning_status) {
this.deadline_warning_status = deadline_warning_status;
}
public String getCpgid() {
return cpgid;
}
public void setCpgid(String cpgid) {
this.cpgid = cpgid;
}
}
}
}
参考文档
https://blog.youkuaiyun.com/donkor_/article/details/77879630