ButterKnife学習の-ButterKnifeはどのように使います


ButterKnife学習の-ButterKnifeはどのように使います
  • 前言
  • なぜButterKnife
  • を使うのか
  • ButterKnife紹介
  • 簡単な例
  • ButterKnife基本原理
  • 使用開始
  • ButterKnife
  • のインポート方法
  • ButterKnife
  • の使用方法
  • 1、バインド
  • 2、各種注釈方式
  • コード混同
  • まとめ
  • 前言
    優秀なAndroid開発者になるには、豊富なプロジェクト経験のほかに、完備した知識体系が必要です.ここで私たちは一緒に成長して一緒に勉強して、自分を理想の自分にします.
    なぜButterKnifeを使うのか
    通常のAndroid開発では、Layoutのコントロールが多いときにfindViewById()を書くのは効率が悪いとよく思いますか?イベントリスニングを様々なsetxxxListenerで設定するのは煩雑だと思いますか?では、ButterKnifeは以上の問題を解決します.
    ButterKnifeの紹介
  • ButterKnifeはAndroidシステムに焦点を当てたView注入フレームワークで、以前は常にfindView ByIdをたくさん書いてViewオブジェクトを見つけることができ、ButterKnifeがあれば簡単にこれらの手順を省くことができます.大神JakeWhartonの力作で、現在広く使われています.最も重要な点は、ButterKnifeを使用するとパフォーマンスにほとんど損失がありません.ButterKnifeが使用する注釈は、実行時に反射されるのではなく、コンパイル時に新しいclassを生成するためです.プロジェクトの統合も特に便利で、使用も特に簡単です.
  • ButterKnifeプロジェクトアドレス
  • ButterKnifeの優位性1、強力なViewバインドとClickなどの各種イベント処理機能、コード量を簡略化し、開発効率2、便利なAdapterの中のViewHolderバインド問題3、配置が便利で、APPの運行時効率4に影響しない、コードの可読性を強化する
  • 単純な例
    public class MainActivity extends BaseActivity<MainContract.Presenter> implements MainContract.View {
    	@BindView(R.id.test_tv)
    	TextView testTv;
    	@BindView(R.id.test_btn)
    	Button testBtn;
        
        Unbinder unbinder;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState){
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.test_layout);
    		unbinder = ButterKnife.bind(this, view);
    	}
    	
    	@OnClick({R.id.test_tv,R.id.test_btn})
    	protected void handleViewClick(View view){
    		switch(view.getId()){
    			case R.id.test_tv:
    				Log.d("TEST","tsest tv click");
    				break;
    			case R.id.test_btn:
    				Log.d("TEST","tsest btn click");
    				break;
    		}
    	}
    
    	@Override
    	protected void onDestory(){
    		super.onDestory();
    		if (unbinder != null && unbinder != Unbinder.EMPTY) {
                unbinder.unbind();
                unbinder = null;
            }
    	}
    }
    

    このようなコードを見ると、かなり簡潔になっているのではないでしょうか.サンプルコードを見ると、以前はfindView()の方法でxmlレイアウトのViewを見つけていましたが、ここでは@BindView()の注釈で置き換えました.そして、以前のsetOnClickListener()の代わりに@OnClick()を使用した.もちろんButterKnifeの似たような方法はたくさんありますが、後で一つ一つ紹介します.
    ButterKnifeの基本原理
    ButterKnifeの初期バージョンは,上記の機能を注釈+反射というランタイム解析を用いて実現し,その後性能を改善するために注釈+APTコンパイル時解析技術を用い,そこからセットテンプレートコードを生成する方式で実現した.だから、使用を始める前に、APTとは何かを簡単に理解しておきましょう.APTはAnnotation Processing Toolの略である注釈処理ツールである.一般的な手順は次のとおりです.
  • 最初に注釈を宣言する宣言期間はCLASS、すなわち@Retention(CLASS)
  • である.
  • は、次いで、AbstractProcessorを統合することによって注釈プロセッサをカスタマイズする.
  • コンパイル時、コンパイラは処理する注釈を持つすべてのクラスをスキャンし、最後にAbstractProcessorのprocessメソッドを呼び出し、注釈を処理する
  • .
    使用開始
    心を奮い立たせる時が来た.今、ButterKnifeの使い方を学びましょう.
    ButterKnifeのインポート方法
    まずmoduleのbuild.gradleでは、次のように追加されます.
    android {
      ...
      // Butterknife requires Java 8.
      compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
      }
    }
    
    dependencies {
      implementation 'com.jakewharton:butterknife:10.2.1'
      annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
    }
    

    ButterKnifeの使い方
    1、バインド
    まずButterKnifeをActivity、Fragment、またはViewにバインドします.ActivityまたはFragmentでバインドされるたびにbindの操作をBaseActivityまたはBaseFragmentに書き込むことをお勧めします.これにより、bindコードを繰り返し書く必要がなくなります.注意:バインドActivityはsetContentViewの後になければなりません.
    public abstract class BaseActivity extends Activity {
    
        private Unbinder unbinder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(getContentView());
            unbinder = ButterKnife.bind(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (unbinder != null && unbinder != Unbinder.EMPTY) {
                unbinder.unbind();
                unbinder = null;
            }
        }
    
        protected abstract int getContentView();
    }
    

    バージョン8.4でButterKnifeがButterKnifeを除去した.unBind()メソッドは、その代わりにButterKnife.bind(this)はUnbinderの参照を返し、Unbinderのunbind()メソッドでバインドを解除します.
    2、各種注釈方式
  • コントロールの注記@BindView
  • //          private  static,      : @BindView fields must not be private or static.
    @BindView(R.id.test_tv)
    protected TextView testTv;
    
  • 複数のコントロールの注記@BindViews
  • @BindViews({R.id.test_tv,R.id.test_tv2})
    protected List<TextView> testTvs;
    
  • 文字列の注記@BindString
  • @BindString(R.string.test_str)
    protected String mTestStr;
    
  • 文字列配列の注記@BindArray
  • @BindArray(R.array.test_str_array)
    protected String[] testStrArray;
    
  • Bitmapリソースの注記@BindBitmap
  • @BindBitmap(R.mipmap.ic_launcher)
    protected Bitmap bitmap;
    
  • クリックイベントバインド@OnClick(類似して@OnTouchなどもある)
  • 注意:このようなイベントバインドは、Viewを宣言することなく、メソッドに直接注釈を付けてバインドできます.
    単一ビューのクリックイベントバインド
    @OnClick(R.id.test_tv)
    protected void handleViewClick(){
    	Log.d("TEST","test tv click");
    }
    

    複数のビューのクリックイベント
    @OnClick({R.id.test_tv,R.id.test_tv2})
    protected void handleMoreViewClick(View view){
    	int viewId = view.getId();
    	switch(viewId){
    		case R.id.test_tv:
    			Log.d("TEST","test tv click");
    			break;
    		case R.id.test_tv2:
    			Log.d("TEST","test tv2 click");
    			break;
    	}
    }
    
  • EditTextに入力コールバック傍受を追加EditTextに入力コールバック傍受を追加する場合、コールバックのタイプを指定する必要があります.次のコード
  • を参照してください.
    @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)  
    void beforeTextChanged(CharSequence s, int start, int count, int after) {  
    
    }  
    @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback.TEXT_CHANGED)  
    void onTextChanged(CharSequence s, int start, int before, int count) {  
    
    }  
    @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)  
    void afterTextChanged(Editable s) {  
    
    }  
    

    コード混同
    -keep class butterknife.** { *; }  
    -dontwarn butterknife.internal.**  
    -keep class **$$ViewBinder { *; }  
    
    -keepclasseswithmembernames class * {  
        @butterknife.* <fields>;  
    }  
    
    -keepclasseswithmembernames class * {  
        @butterknife.* <methods>;  
    }  
    
    
    

    まとめ
    最後にここで小さなまとめをします.Bind()の呼び出しはActivityでsetContentViewの後2、宣言修飾子はprivateとstaticでは使用できません.そうしないと、異常が発生します.3、独自のBaseActivityまたはBaseFragmentをカプセル化してButterKnifeを統一的に呼び出すことをお勧めします.bind()メソッドは、サブクラス継承後にバインディング4を行うことなく、8.4以降にunBIndメソッドを除去するButterKnifeを用いることができる.bind(this)はUnbinderの参照を返し、Unbinderのunbind()メソッドでバインド解除を行います.
    最後に完成した後、Reviewで自分のコードがはっきりしたと感じたのではないでしょうか.何?それとも面倒くさいと思いますか?もっと良い方法はありませんか?もっと怠け者になってもいいですか.次の編では、プラグインで以上のコードを生成する方法についてお話しします.