Androidスキル雑談-コントロールのクリックイベントを優雅に処理する方法

4068 ワード

まずベストプラクティスを共有します.
複雑なAndroidアプリケーションを開発するときによくBaseActivityやBaseFragmentと書きますが、ネットの状況を傍受したり、ダイアログをポップアップしたり、actionbarを設定したりして、ビジネスを実現するActivityやFragmentがこのベースクラスから継承されています.これにより、コード量を大幅に節約でき、メンテナンスも迅速に行えます.
しかし、インタフェースにViewが多く、clickイベントが多い場合は、setOnClickのようなコードを書くのではないでしょうか.筆者の経験では、ViewClickが処理するコードをより優雅にする方法は2つあります.
  • butterknifeフレーム
  • を使用
  • ベースクラスで文書を作成する
  • 前者はあまり言わないが、butterknifeの資料をもっと参考にして、ここでは後者の方法を重点的に紹介する.
     
    問題導入(ここではFragmentを例に挙げる)
    ビューにclickイベントを設定する必要がある場合は、従来のコードは次のとおりです.
    private TextView mPayment;
    
    mPayment = (TextView) findViewById(R.id.payment);
    
    mPayment.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //do something
                }
            });

    ビューのクリックイベントを処理するために、具体的なクリックイベントを書いていないのに、こんなに多くのコードが積まれているのを見てください.しかし、このViewを使うかどうか考えたことがありますか?findviewbyidが出る必要がありますか?クリックイベントを処理するだけでこのように書くことができますか?
    findViewById(R.id.payment).setOnClickListener(this);
    
     @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id) {
                case R.id.payment:
    
                    break;
            }
        }

    ここのonClickはFragment全体でimplementsを1つ必要としています.onClickListener後に自動的に強制的に実現する必要があり、具体的なクリックイベントは中で行うことができます.
    上のコードは私が実際にmPaymentというTextViewのインスタンスを取得していないことを見ることができますが、実際には彼を取得する必要はありません.後で私は彼を変えることはありませんから.オブジェクトが1つ足りないため、メモリ消費を減らすメリットもあります.
     
    改造ベースクラス
     
    追加するクリックイベントviewがたくさんある場合は、ここにはこのようなコードがたくさん書かれています.
    findViewById(R.id.payment).setOnClickListener(this);

    コードが重複しているため、これらのコードはベースクラスに配置できることが明らかになり、ベースクラスでは次のように設計されています.
    public abstract class BaseFragment extends Fragment implements View.OnClickListener{
    
        public void setViewClickListener(ArrayList<Integer> viewIds, View rootView) {
            for (int viewId : viewIds) {
                rootView.findViewById(viewId).setOnClickListener(this);
            }
        }
    }

    この方法はviewのidを要素とするlistと停止viewを入力すればよい.
    では、サブクラスはこのBaseFragmentから継承されています.具体的な書き方は:
    public class RootCashierFragment extends BaseFragment {
    
        private ArrayList<Integer> viewIds = new ArrayList<>();
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.root_layout_cashier, null);
            viewIds.add(R.id.fab);
            setViewClickListener(viewIds, view);
            return view;
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.payment:
                    L.d("click payment");
                   
                    break;
    
            }
        }
    
    }

    このようにすべてのviewのclick事件はすべてonClickの中に置いて、とても優雅で乱れていないように見えて、維持しても一目瞭然です
     
    メンテナンス方法
    後期にリスニングが必要なイベントを減らすviewを追加する必要がある場合は、2つのことをする必要があります.
  • viewIdsにおけるadd新規(remove旧)のviewのid
  • onClick実装(削除)クリック後の具体的な内容