Android Butterknife 注入框架


 簡介

  ButterKnife是一個專注於Android系統的View注入框架,當一個布局十分復雜時,需要引入執行大量的findViewById代碼來找到View的對象,有了ButterKnife可以很輕松的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。最重要的一點,使用ButterKnife對性能基本沒有損失,因為ButterKnife用到的注解並不是在運行時反射的,而是在編譯的時候生成新的class。項目集成起來也是特別方便,使用起來也是特別簡單。

ButterKnife的優勢

  1. 強大的View綁定事件和資源文件的綁定
  2. 使用的便捷性上,剔除了原始綁定時候的復雜性
  3. 由於大多數的注解都是在編譯期,所以不會影響程序運行的效率
  4. 代碼清晰,可讀性相對來說要強很多

github 地址: https://github.com/JakeWharton/butterknife

如何使用?

  在Android Studio 項目中配置ButterKnife

 1.在Project的 build.gradle 中添加如下代碼:

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        //添加如下代碼
        classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

  2.在App的 build.gradle 中添加如下代碼:

apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.butterknife'//添加這一行

android {
    compileSdkVersion 28



    defaultConfig {
        applicationId "com.hejun.loader"
        minSdkVersion 26
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.jakewharton:butterknife:9.0.0-rc2'
    annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc2'//添加這一行
}

  ButterKnife插件的添加:可以快速綁定

   File -> Settings -> Plugins -> 搜索ButterKnife,找到Android ButterKnife Zeleany進行安裝重啟AndroidStudio

插件的使用:在布局資源上右鍵點擊,如下圖

選中需要綁定的view ,點擊confim會自動生成代碼

ButterKnife的注解類型

  1.綁定注解,視圖,資源等等

  2.綁定事件

注意:在使用Butterknife 是要 綁定Butterknife .如下

1.在activity中綁定

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

 2.在Fragment中綁定

Fragment的生命周期不同於activity。在onCreateView中綁定一個Fragment時,在onDestroyView中將視圖設置為null。當你調用bind來為你綁定一個Fragment時,Butter Knife會返回一個Unbinder的實例。在適當的生命周期(onDestroyView)回調中調用它的unbind方法進行Fragment解綁。使用ButterKnife.bind(this, view)進行綁定。

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

3.在Adapter中綁定

  在Adapter的ViewHolder中使用,將ViewHolder加一個構造方法,在new ViewHolder的時候把view傳遞進去。使用ButterKnife.bind(this, view)進行綁定

class Adapter extends BaseAdapter {

        private Context context;

        private List<Userbean> users = new ArrayList<>();

        public Adapter(Context context) {
            this.context = context;
        }

        public void addUsers(List<Userbean> userList) {
            users.addAll(userList);
            notifyDataSetChanged();
        }

        @Override
        public int getCount() {
            return users.size();
        }

        @Override
        public Userbean getItem(int position) {
            return users.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder = null;
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
                viewHolder = new ViewHolder(convertView);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            Userbean userbean = users.get(position);
            viewHolder.name.setText(userbean.getName());
            viewHolder.password.setText(userbean.getPassword());
            return convertView;
        }

        class ViewHolder {
            @BindView(R.id.name)
            TextView name;
            @BindView(R.id.password)
            TextView password;

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM