2011-06-19 62 views
10

Ngay bây giờ tôi đang xử lý khóa nhập trong các trường EditText của tôi bằng cách sử dụng một onEditorActionListener và xem ID hành động cho IME_NULL. Nó hoạt động tốt cho tất cả người dùng của tôi ngoại trừ một người dùng. Cô ấy có Xperia Arc.Xử lý phím enter trong EditText trên các thiết bị khác nhau

TextView.OnEditorActionListener keyListener = new TextView.OnEditorActionListener(){ 
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { 
    if(actionId == EditorInfo.IME_NULL){ 
     if(((EditText)findViewById(view.getId())) == ((EditText)findViewById(R.id.etUser))){ 
     ((EditText) findViewById(R.id.etPass)).requestFocus(); 
     } 
     if(((EditText)findViewById(view.getId())) == ((EditText)findViewById(R.id.etPass))){ 
     logon(); 
     } 
    } 
    return true; 
    } 
}; 

Sau khi tìm hiểu về vấn đề này, tôi đã cố gắng tiếp cận khác bằng cách sử dụng một onKeyListener và tìm kiếm các ACTION_DOWN sự kiện quan trọng sau đó kiểm tra mã phím nếu nó phù hợp KEYCODE_ENTER.

EditText etUserName = (EditText) findViewById(R.id.etUser); 
etUserName.setOnKeyListener(new OnKeyListener() { 
    public boolean onKey(View view, int keyCode, KeyEvent event){ 
    if (event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch (keyCode) 
     { 
     case KeyEvent.KEYCODE_DPAD_CENTER: 
     case KeyEvent.KEYCODE_ENTER: 
      if(((EditText)findViewById(view.getId())) == ((EditText)findViewById(R.id.etUser))){ 
      ((EditText) findViewById(R.id.etPass)).requestFocus(); 
      } 
      return true; 
     default: 
      break; 
     } 
    } 
    return false; 
    } 
}); 

Không có súc sắc cho điều đó. Tôi đang thua lỗ ngay bây giờ. Có rất nhiều ứng dụng trên đó xử lý phím enter tốt. họ đang làm gì khác?

+0

Bạn có gặp bất kỳ cơ hội nào để tìm ra lỗi này không? Tôi thực sự cần phải đánh chặn enter-press, không chỉ giữ cho văn bản trên một hàng. – pgsandstrom

Trả lời

16

tôi đã tìm ra cách để làm cho nó làm việc.

Tôi phải thêm android: singleLine = "true" vào thẻ EditText trong XML bố cục (luân phiên, bạn có thể đặt bằng cách sử dụng setSingleLine() trong mã). Điều này buộc văn bản chỉnh sửa chỉ sử dụng một dòng và tiêu điểm sẽ chuyển đến hộp EditText tiếp theo.

+0

TY Tôi phải làm điều này trên G2X để hiển thị nút tiếp theo. – maebe

+0

Cảm ơn giải pháp đó. Tôi đã cố gắng nắm bắt phím enter. Ngoài ra, cố gắng chuyển sang EditText tiếp theo khi nhấn phím enter trên bàn phím ảo. Cho đến khi tôi thấy dòng đơn giản này mà bạn cung cấp, mọi thứ đều được giải quyết. +1 cho điều đó! – detno29

+0

sử dụng 'android: maxLines =" 1 "' thay vì 'android: singleLine =" true "' không được dùng nữa – blueware

6

Hãy thử giải pháp này: (Tôi đã không kiểm tra nó)

Thiết lập thuộc tính sau đây để bạn EditText

android:imeOptions="actionNext" 

Bây giờ bạn có thể thiết lập sau onEditorAction

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    if (actionId == EditorInfo.IME_ACTION_NEXT) { 
     // Program Logic Here 
     return true;  
    } 
    return false; 
} 

Đối với một số chức năng bổ sung, bạn có thể đặt mật khẩu của mình EditText thành:

android:imeOptions="actionDone" 

Vì vậy, bạn có thể chỉ có một cái gì đó như thế này:

TextView.OnEditorActionListener keyListener = new TextView.OnEditorActionListener(){ 
     public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { 
      if(actionId == EditorInfo.IME_ACTION_NEXT) { 
       ((EditText) findViewById(R.id.etPass)).requestFocus(); 
      } 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 
       logon(); 
      } 
      return true; 
     } 
    }; 
+0

Hoạt động tốt trên thiết bị của tôi, không có gì trên người dùng. Tôi đã cho cô ấy một bản dựng thử nghiệm với một số mã gỡ lỗi hiển thị id hành động trong một lần xem văn bản. không có gì. Tôi không nghĩ rằng nó thậm chí còn đi vào phương thức onEditorAction. – Scott

+0

Vì vậy, không có id hành động, không có vấn đề gì cô ấy nhấn? Ngay cả khi nó là một nhân vật? – jsw

+0

Trong onEditorAction, hãy nhớ trả về false nếu bạn không tiêu thụ hành động. –

0
(EditText) passwordView = (EditText) findViewById(R.id.password); 
passwordView.setImeOptions(EditorInfo.IME_ACTION_DONE); 
    passwordView.setOnEditorActionListener(new OnEditorActionListener() 
     { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
      { 
       String input; 
       if(actionId == EditorInfo.IME_ACTION_DONE) 
       { 
        input= v.getText().toString(); 
        Toast toast= Toast.makeText(LogIn.this,input, 
          Toast.LENGTH_LONG); 
        toast.setGravity(Gravity.CENTER, 0, 0); 
        toast.show(); 
        return true; 
       } 
       return false; 
      } 
     }); 
+1

Xin vui lòng, không chỉ cung cấp mã, mà còn trực giác. – vefthym

+0

Bạn có thể giải thích câu trả lời của mình một chút được không. – grattmandu03

+1

khi passwordView được tập trung vào phím bàn phím "next" là "ok" và nếu bạn nhấp vào OK onEditorAction() sẽ được gọi –

Các vấn đề liên quan