EditText setOnFocusChangeListener для всех редактируемых текстов

У меня есть несколько полей EditText, которые я хочу сохранить в SQLiteDatabase с setOnFocusChangeListener. Должен ли я установить 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());
        }
    }
});

нравится... есть ли способ иметь ArrayList представлений EditText, назначить указатель (извините, не уверен, как) на существующие editTexts и установить onFocusChangeListener на весь класса ArrayList? Или даже выполнить итерацию через ArrayList и установить onFocusChangeListener для каждого члена?

или способ обнаружить любые события onFocusChangeListener и просто сохранить все данные в базе данных, независимо от того, какой EditText даже произошел?

4 ответов


Ну, вы могли бы реализовать свою деятельность OnFocusChangeListener. Таким образом,все ваши изменения будут на этом одном metho, d, но вам придется проверить, какой вид изменил фокус, получив идентификатор вида с v.getId() и ручки соответственно.

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

    ...etc
    }
}

мое предложение было бы использовать специальный 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());
    }
}

вы можете решить обрабатывать клиент и ключи данных по-разному, но идея заключается в том, что вы используете пользовательский базовый класс, который будет обрабатывать его автоматически.


есть много способов сделать это проще. Во-первых, как насчет абстрагирования этого в метод и вызова его для каждого 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");

или еще проще

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) имеет представление параметров, вы можете использовать его, чтобы определить, какое представление называется