0

パフォーマンスと最適化の観点から、プロジェクト全体に共通の汎用テキストウォッチャーを使用するのはどの程度良いですか?私のプロジェクトでは、多くの edittext を使用しており、各 edittext には実装するリスナーがあります。このような一般的なテキストウォッチャーを作成しました。各リスナーで画面の他のビューにアクセスする必要があるため、それらのビューをコンストラクターで渡します。以下のアプローチはコードの可読性を向上させますが、キャストのオーバーヘッドが発生します。従うのが良い方法ですか?このアプローチ?私が従うことができるより良いアプローチはありますか?-

public class GenericTextWatcher implements TextWatcher {

    private View view,view2,view3,view4;
    public  GenericTextWatcher(View view) {
        this.view = view;
    }
    public GenericTextWatcher(View view,View view2,View view3) {
         this.view = view;
        this.view2=view2;
        this.view3=view3;
     }
    public GenericTextWatcher(View view,View view2) {
        this.view = view;
        this.view2=view2;
    }
    public GenericTextWatcher(View view,View view2,View view3,View view4) {
        this.view = view;
        this.view2=view2;
        this.view3=view3;
        this.view4=view4;
    }

    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        switch (view.getId())
        {
            case R.id.etMfafasf:
                if (((EditText)view).getText().length()==8 &&((EditText)view2).getText().length()>0)
                    ((TextView)view3).setEnabled(true);
                else
                    ((TextView)view3).setEnabled(false);
                break;
            case R.id.etModaDFFSA:
                if (((EditText)view2).getText().length()>0 &&((EditText)view).getText().length()==8)
                    ((TextView)view3).setEnabled(true);
                else
                    ((TextView)view3).setEnabled(false);
               ValidationUtils.checkfasffsfimit(charSequence,(TextInputLayout)view4);
                break;

            case R.id.etMoXYZ:
                if (((EditText)view).getText().length()==8)
                    ((TextView)view2).setEnabled(true);
                else
                    ((TextView)view2).setEnabled(false);
                break;
        }
    }

    public void afterTextChanged(Editable editable) {

    }
}

TextWatcher の呼び出し

etNumber.addTextChangedListener(new GenericTextWatcher(etNumber,tvNdf));
4

2 に答える 2

1

実行時の型キャストのコストを回避したい場合は、より構造化された方法でこれを開発できると思います。

public class GenericTextWatcher implements TextWatcher {

    private EditText[] mEditArray;
    private TextView[] mTextArray;

    public  GenericTextWatcher(EditText[] editArray, EditText textArray) {
        mEditArray = editArray;
        mTextArray = textArray;
    }

    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        switch (view.getId())
        {
            case R.id.etMfafasf:

                EditText view= mEditArray[0], view2 = mEditArray[1];

                TextView view3 = mTextArray[0]; 
                if (view.getText().length()==8 && view2.getText().length()>0)
                    view3.setEnabled(true);
                else
                    view3.setEnabled(false);
                break;

            case R.id.etModaDFFSA:
                EditText view= mEditArray[0], view2 = mEditArray[1];

                TextView view3 = mTextArray[0]; 
                if (view2.getText().length()>0 && view.getText().length()==8)
                    view3.setEnabled(true);
                else
                    view3.setEnabled(false);
               ValidationUtils.checkfasffsfimit(charSequence,(TextInputLayout)view4);
                break;

            case R.id.etMoXYZ:
                EditText view= mEditArray[0], view2 = mEditArray[1];

                if (view.getText().length()==8)
                    view2.setEnabled(true);
                else
                    view2.setEnabled(false);
                break;
        }
    }
 }

そして、これを次のようにリスナーに割り当てることができます:

etNumber.addTextChangedListener(
new GenericTextWatcher(new EditText[]{etNumber}, new TextView[]{tvNdf}));

引数の数に基づいてコンストラクターをオーバーロードしているため、これによりクリーンになります...これは最適な設計ではない可能性があります。明日、10 個のビューを持つコンストラクターが必要になるとしましょう。オーバーロードされたコンストラクターは GenericTextWatcher(view 、view1、view2 ....、view9)

于 2016-10-30T19:07:53.420 に答える
0

あなたのコードは正常に動作します。ただし、ベスト プラクティスが必要な場合は、publish/subscribeをお勧めします。

たとえば、Google Guava Library のEventBus - 「コンポーネントを相互に明示的に登録する必要のない、コンポーネント間のパブリッシュ/サブスクライブ スタイルの通信」。

ここに例があります、

アクティビティまたはフラグメントで、イベント バスを作成します

EventBus eventBus = new EventBus();

イベントをリッスン (サブスクライブ) するオブジェクトを登録します。この場合、それはあなたのアクティビティまたはフラグメントになります

eventBus.register(this);

次に、イベントとなるクラスを作成します

public class EditEvent {
     private CharSequence charSequence, int i, int i1, int i2, int id; // add getters and setters
     public EditEvent(CharSequence charSequence, int i, int i1, int i2, int id)
     {//...}
}

次に、 @Subscribe アノテーションを使用して、アクティビティまたはフラグメントでイベントをサブスクライブします。

@Subscribe // this will be called when an EditEvent is posted to the bus
public void handleTextChange(EditEvent event) {
     switch (event.id)
     {
           //...
     }
}

最後に、各ビューのウォッチャーで、イベントを投稿します

onTextChanged(CharSequence s, int start, int before, int count)
{
       eventBus.post(new EditEvent(s, start, before, count, EditText.this));
}
于 2016-10-30T19:02:04.893 に答える