永远不会调用Android onKey()

时间:2014-03-27 14:37:35

标签: android keylistener

我想收听EditText's的关键事件,每当按下next时,我想将EditText的文本保存到我的数据对象中。我实施了OnKeyListener及其onKey()方法,该方法从未被调用过,无法解决原因......这是我的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
    savedInstanceState) {
    v = inflater.inflate(R.layout.frag_userprofile_myinfo, container, false);
    context = getActivity().getApplicationContext();
    global = (eKeshGlobal) context;

    pbWait = (ProgressBar) v.findViewById(R.id.pbWait);

    bnDone = (Button) v.findViewById(R.id.bnDone);
    rlBack = (RelativeLayout) v.findViewById(R.id.rlBack);

    etFirstName = (EditText) v.findViewById(R.id.etFirstName);
    etLastName = (EditText) v.findViewById(R.id.etLastName);
    etAdress = (EditText) v.findViewById(R.id.etAdress);
    etMobile = (EditText) v.findViewById(R.id.etMobile);
    etDob = (EditText) v.findViewById(R.id.etDob);
    etOib = (EditText) v.findViewById(R.id.etOib);

    etFirstName.setOnKeyListener(this);
    etLastName.setOnKeyListener(this);
    etAdress.setOnKeyListener(this);
    etMobile.setOnKeyListener(this);
    etDob.setOnKeyListener(this);
    etOib.setOnKeyListener(this);


    return v;

}

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == 
KeyEvent.KEYCODE_ENTER)) {

        switch(v.getId()) {

        case R.id.etFirstName:
            user.setFirstName(etFirstName.getText().toString());
            return true;

        case R.id.etLastName:
            user.setLastName(etLastName.getText().toString());
            return true;

        case R.id.etAdress:
            user.setAddress(etAdress.getText().toString());
            return true;

        case R.id.etMobile:
            user.setMobile(etMobile.getText().toString());
            return true;

        case R.id.etDob:
            user.setDateOfBirth(Utils.formatDate(context, 
etDob.getText().toString()));
            return true;

        case R.id.etOib:
            user.setOib(etOib.getText().toString());
            return true;

        default:
            return false;
        }   
    }

    return false;
}

当然,我已经实施了听众:

public class UserProfileMyInfo extends Fragment implements View.OnKeyListener

以下是EditText xml:

的样本
<EditText
      android:id="@+id/etLastName"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_gravity="left"
      android:ems="10"
      android:hint="@string/my_profile_lastname"
      android:imeOptions="actionNext"
      android:inputType="text"
      android:singleLine="true" />

我真的没有想法来完成这项工作,我也尝试onKeyDown(),但也没有工作......提前谢谢!

2 个答案:

答案 0 :(得分:2)

从文档中,View.OnKeyListener用于硬件密钥。这就是为什么它不起作用。

  

硬件密钥时要调用的回调的接口定义   事件被分派到此视图。之前将调用回调   关键事件被赋予视图。这仅适用于硬件   键盘;软件输入法没有义务触发这个   监听器。

答案 1 :(得分:1)

如果您只想捕获Next键事件,则应考虑使用android:imeOptions

在清单中将其设置为

<EditText
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/search_hint"
android:inputType="text"
android:imeOptions="actionNext" />

并在EdiText上调用setOnEditorActionListener()方法的代码中捕获它

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND) {
        //do your stuff here
        handled = true;
    }
    return handled;
 }
});

还有很多其他选择。请访问here.