39、Android--ButterKnife

2021/7/12 6:06:02

本文主要是介绍39、Android--ButterKnife,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

ButterKnife

ButterKnife从严格意义讲不算是依赖注入框架,它只是专注于Android系统的View注入框架,并不支持其他方面的注入。它可以减少大量的findViewById以及setOnClickListener代码,简化代码并提升开发效率。

基本使用

添加依赖

使用ButterKnife需要添加相应的依赖:

implementation "com.jakewharton:butterknife:10.2.3"
annotationProcessor  "com.jakewharton:butterknife-compiler:10.2.3"

在project/build.gradle中引入插件:

dependencies {
    classpath "com.android.tools.build:gradle:4.0.1"
    classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
}

除此之外,还需要在app/build.gradle引入相应的插件id:

plugins {
    id 'com.android.application'
    id 'com.jakewharton.butterknife'
}

绑定控件

用注解@BindView绑定控件id,代码如下所示:

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.tv_text)
    TextView tvText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        tvText.setText("Bind View");
    }
}

用注解@BindViews绑定多个控件id,代码如下所示:

public class MainActivity extends AppCompatActivity {
    @BindViews({R.id.tv_text, R.id.tv_text1, R.id.tv_text2})
    List<TextView> textViews;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        for (int i = 0; i < textViews.size(); i++){
            textViews.get(i).setText("Bind View" + i);
        }
    }
}

绑定资源

可以用注解@BindString、@BindArray、@BindBool、@BindColor、@BindDimen、@BindDrawable和@BindBitmap。

@BindString(R.string.app_name)
String appName;
@BindArray(R.array.swordsman)
String[] swordsman;
@BindDimen(R.dimen.activity_horizontal_margin)
float margin;

绑定监听

用@OnClick来对“点击事件”进行监听,同理也可以用@OnLongClick来对“长按点击事件”进行监听,如下所示:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.tv_text)
    public void onTextClick(View view){
        Toast.makeText(this, "Bind Click Event", Toast.LENGTH_SHORT).show();
    }

    @OnLongClick(R.id.tv_text)
    public void onTextLongClick(View view){
        Toast.makeText(this, "Bind Long Click Event", Toast.LENGTH_SHORT).show();
    }
}

除此之外,还可以通过@OnTextChanged、@OnTouch、@OnItemClick等事件进行监听。

可选绑定

@BindView或者其他的注解操作符,如果不能找到目标资源,则会引发异常。为了防止异常,可以添加@Nullable注解:

@Nullable
@BindView(R.id.tv_text)
TextView tvName;

其他应用

除了前面在Activity中使用ButterKnife之外,我们还可以在Fragment中使用它,如下所示:

public class BlankFragment extends Fragment {
    @BindView(R2.id.tv_text)
    TextView tvText;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View layout = inflater.inflate(R.layout.fragment_blank, container, false);
        ButterKnife.bind(this, layout);
        tvText.setText("Bind Text");
        return layout;
    }
}

在Adapter中我们也需要引用控件资源,也可以使用ButterKnife,如下所示:

public class RecycleAdapter extends RecyclerView.Adapter {
    private Context mContext;
    private List<String> mStrings;

    public RecycleAdapter(Context context, List<String> strings) {
        this.mContext = context;
        this.mStrings = strings;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(
                R.layout.item_recycleview, parent, false);
        MyViewHold hold = new MyViewHold(view);
        return hold;
    }
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((MyViewHold)holder).mTvContent.setText(mStrings.get(position));
    }
    @Override
    public int getItemCount() {
        return mStrings.size();
    }
    class MyViewHold extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_item_content)
        TextView mTvContent;
        public MyViewHold(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

其中Activity的代码如下所示:

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.recycler_view)
    RecyclerView mRecyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        List<String> strings = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            strings.add("String" + i);
        }
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        RecycleAdapter adapter = new RecycleAdapter(this, strings);
        mRecyclerView.setAdapter(adapter);
    }
}

模块开发

在Module中使用ButterKnife需要注意,在每个模块的build.gradle文件中都需要添加相应的注解:

annotationProcessor  "com.jakewharton:butterknife-compiler:10.2.3"

而在Module中进行绑定ID操作需要使用R2即可。

@BindView(R2.id.tv_text)
TextView tvText;


这篇关于39、Android--ButterKnife的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程