EditText设置所有EditText的OnFocusChangeListener

18

我有几个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 Views 的 ArrayList<EditText>,将指针(不确定如何实现)分配给现有的 editText 并将 onFocusChangeListener 设置为整个 ArrayList?还是说,遍历 ArrayList 并将 onFocusChangeListener 设置给每个成员?

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

4个回答

31

你可以让你的活动实现OnFocusChangeListener。这样,所有更改都将在一个方法中处理,但你需要通过使用v.getId()获取视图id并做相应处理来检查哪个视图获得了焦点。

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

    ...etc
    }
}

这实际上是我要使用的方法;而且幸运的是,片段也可以实现OnFocusChangedListener!最终,代码更少。 - James Perih
1
难道不应该是OnFocusChangeListener而不是OnFocusChange-d-Listener吗?(为了清晰起见添加连字符。)显然这不是什么大问题,但我还是花了一分钟才弄明白。 - Kirk
我在这方面遇到了困难,setOnFocusChangeListener被传递了一个匿名内部类,我应该如何更改这一部分以使整个程序正常工作? - kuldeep

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");

这很有趣。我会尝试的。谢谢! - James Perih

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());
    }
}

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

1
哇,超出我的薪资等级了。也许最终我会明白其中大部分是什么意思。我只是一个新手。 - James Perih

2
甚至更简单
OnFocusChangeListener listener;

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

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

由于onFocusChange(View v,boolean hasFocus)具有参数View,因此您可以使用它来告诉哪个视图调用了它。


这段代码可以运行,但是有一些错别字。正确的代码应该是:OnFocusChangeListener listener; listener = new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { //做一些事情 } }; - Zerato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接