EditText上setOnFocusChangeListener所有EditTexts(EditT

2019-09-01 14:24发布

我有我想要保存与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上>,指定一个指针(对不起,不知道如何),以现有的editTexts并设置onFocusChangeListener整个数组列表? 或者,甚至,遍历该ArrayList和设置onFocusChangeListener到每个成员?

或者一种方法来检测任何onFocusChangeListener事件,只是所有的数据保存到数据库中,不管是什么EDITTEXT的甚至发生了?

Answer 1:

好了,你可以有你的活动实施OnFocusChangeListener 。 这样一来,所有的修改将是一个实现方法具,d但你必须通过获取与视图id检查哪些改变视图焦点v.getId()和相应的处理。

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

    ...etc
    }
}


Answer 2:

有很多你可以做这个简单的方法。 其一,怎么样这个抽象成一个方法,把它的每个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");


Answer 3:

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

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



Answer 4:

或者更简单

OnFocusChangeListener listener;

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

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

由于onFocusChange(查看V,布尔hasFocus)具有参数视图中,您可以用它来判断哪些观点称之为



文章来源: EditText setOnFocusChangeListener on all EditTexts