Android便捷工具介绍:Butterknife和GsonFormat

博客介绍了ButterKnife和JSON内容自动化生成JAVA类的相关操作。在Android Studio环境下,前者需安装Android ButterKnife Zelezny插件并添加依赖,介绍了Activity和Fragment的绑定方法;后者需安装GsonFormat插件,说明了生成JAVA类的操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一部分、 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值