2014-03-27 59 views
1

我想收听我的EditText's的按键事件,并且只要按下next我想将EditText的文本保存到我的数据对象。我实现OnKeyListener及其onKey()方法,它永远不会被调用,并不能得到为什么...这里是我的代码:Android 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" /> 

我真的运行的想法得到这个工作,我tryed与onKeyDown()也是,但也没有工作..预先感谢!

+0

它应该工作我不明白为什么不,你确定没有其他原因,你认为它不工作?如果你在onKey的第一行放置一个断点,它会受到影响吗? – Eluvatar

回答

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.

+0

它的工作完美,谢谢! – pavle

2

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

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

+1

感谢您的有用信息,也让我添加一个可能的解决方案,[SoftKey,Detect Done](http://stackoverflow.com/a/5077543/5212904),因为'View.OnKeyListener'用于硬件密钥; – ArtiomLK

相关问题