web-dev-qa-db-ja.com

EditTextすべてのEditTextのsetOnFocusChangeListener

SetOnFocusChangeListenerでSQLiteDatabaseに保存したいEditTextフィールドがいくつかあります。 onFocusChangeListenerをそれぞれ個別に設定する必要がありますか、それとも何らかのキャッチオールがありますか? (これはフラグメントであるため、getActivity()。findViewByID)

final TextView txtName = (TextView)getActivity().findViewById(R.id.clientHeader);
final TextView txtCompany = (TextView)getActivity().findViewById(R.id.txtContactCompany);       
final TextView txtPosition = (TextView)getActivity().findViewById(R.id.txtContactPosition);     


txtName.setOnFocusChangeListener(new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {
            saveThisItem(txtClientID.getText().toString(), "name", txtName.getText().toString());
        }
    }
});


txtCompany.setOnFocusChangeListener(new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {
            saveThisItem(txtClientID.getText().toString(), "company", txtCompany.getText().toString());
        }
    }
});

txtPosition.setOnFocusChangeListener(new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {
            saveThisItem(txtClientID.getText().toString(), "position", txtPosition.getText().toString());
        }
    }
});

同様に、EditTextビューのArrayList <EditText>を使用し、既存のeditTextにポインターを割り当てて(申し訳ありませんが、方法は不明)、onFocusChangeListenerをarraylist全体に設定する方法はありますか?または、ArrayListを反復処理し、onFocusChangeListenerを各メンバーに設定しますか?

または、任意のonFocusChangeListenerイベントを検出し、イベントが発生したEditTextに関係なく、すべてのデータをデータベースに保存する方法ですか?

13
James Perih

アクティビティにOnFocusChangeListenerを実装させることもできます。そうすれば、すべての変更はその1つの方法で行われますが、v.getId()でビューIDを取得し、それに応じて処理することで、どのビューがフォーカスを変更したかを確認する必要があります。

@Override
public void onFocusChange(View v, boolean hasFocus) {
    switch(v.getId()){
    case r.id.editText1:
    break;

    ...etc
    }
}
22
tyczj

これを簡単にする方法はたくさんあります。たとえば、これをメソッドに抽象化し、イベントを追加する各TextViewに対して呼び出す方法は次のとおりです。

private void setOnFocusChangeListener(TextView textView, String name){

    textView.setOnFocusChangeListener(new OnFocusChangeListener() {          
        public void onFocusChange(View v, boolean hasFocus) {
            if(!hasFocus) {
                saveThisItem(txtClientID.getText(), name, 
                             textView.getText());
            }
        }
    });
}

次に、TextViewインスタンスごとにこのメソッドを呼び出すことができます。

setOnFocusChangeListener(txtName, "name");
setOnFocusChangeListener(txtCompany, "company");
setOnFocusChangeListener(txtPosition, "position");
10
mattgmg1990

私の提案は、カスタムEditTextを使用してこれを処理することです。

public class SaveEditText extends EditText implements View.OnFocusChangeListener {
    private String mDataKey;
    private String mClient;

    public SaveEditText (Context context) {
        super(context);
        setOnFocusChangeListener(this);
    }

    public SaveEditText (Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnFocusChangeListener(this);
    }

    public void setDataKey (String dataKey) {
        mDataKey = dataKey;
    }

    public void setClient (String client) {
        mClient = client;
    }

    @Override
    public void onFocusChange (View v, boolean hasFocus) {
        saveThisItem(mClient, mDataKey, getText().toString());
    }
}

クライアントキーとデータキーを別々に処理することもできますが、アイデアは、それを自動的に処理するカスタムベースクラスを使用することです。

8
kcoppock

またはさらにシンプル

OnFocusChangeListener listener;

listener = new new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
...        }
    }
});

textbox1. setOnFocusChangeListener(listener);
textbox2. setOnFocusChangeListener(listener);
textbox3. setOnFocusChangeListener(listener);

OnFocusChange(View v、boolean hasFocus)にはパラメーターViewがあるため、これを使用して、どのビューがそれを呼び出したかを知ることができます

3
Ian