17

我有几个 EditText 字段,我想用 setOnFocusChangeListener 将它们保存到 SQLiteDatabase。我是否必须为每个单独设置一个 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 >,为现有的 editTexts 分配一个指针(抱歉,不确定如何)并将 onFocusChangeListener 设置为整个数组列表?或者,甚至,遍历 ArrayList 并将 onFocusChangeListener 设置为每个成员?

或者一种检测任何 onFocusChangeListener 事件的方法,并将所有数据保存到数据库中,而不管事件发生在什么 EditText 上?

4

4 回答 4

31

好吧,你可以让你的活动实现OnFocusChangeListener。这样,您的所有更改都将在该方法上进行,但您必须通过获取视图 IDv.getId()并相应地处理来检查哪个视图更改了焦点。

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

    ...etc
    }
}
于 2013-05-01T01:56:13.413 回答
13

有很多方法可以让这变得更简单。一方面,如何将其抽象为一个方法并为每个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");
于 2013-05-01T01:55:39.363 回答
8

我的建议是使用自定义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());
    }
}

您可能决定以不同的方式处理客户端和数据键,但想法是您使用自定义基类来自动处理它。

于 2013-05-01T02:06:21.543 回答
3

或者更简单

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 你可以用它来告诉哪个视图调用它

于 2013-05-01T02:13:18.053 回答