2010-11-03 26 views
24

Chỉ trên một điện thoại tôi đang thử nghiệm trên (HTC Incredible, Android 2.2, Phần mềm 3.21.605.1), tôi đang gặp phải hành vi sau đây.OnEditorActionListener được gọi hai lần với cùng một eventTime trên bàn phím SenseUI

Trình xử lý sự kiện onEditorAction đang được gọi hai lần (ngay) khi nhấn phím Enter trên bàn phím giao diện người dùng Sense.

Các KeyEvent.getEventTime() là như nhau cho cả hai lần sự kiện này được gọi, dẫn tôi đến công việc xung quanh này:

protected void onCreate(Bundle savedInstanceState) { 
    [...] 

    EditText text = (EditText)findViewById(R.id.txtBox); 
    text.setOnEditorActionListener(new OnEditorActionListener() { 
     private long lastCalled = -1; 

     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (event.getEventTime() == lastCalled) { 
       return false; 
      } else { 
       lastCalled = event.getEventTime(); 
       handleNextButton(v); 
       return true; 
      } 
     } 
    }); 

    [...] 
} 

Các EditText được định nghĩa là:

<EditText 
    android:layout_width="150sp" 
    android:layout_height="wrap_content" 
    android:id="@+id/txtBox" 
    android:imeOptions="actionNext" 
    android:capitalize="characters" 
    android:singleLine="true" 
    android:inputType="textVisiblePassword|textCapCharacters|textNoSuggestions" 
    android:autoText="false" 
    android:editable="true" 
    android:maxLength="6" 
/> 

On tất cả các thiết bị khác mà tôi đã thử nghiệm trên, nút hành động được gắn nhãn đúng "Tiếp theo" và sự kiện này chỉ được gọi là một lần duy nhất khi nút đó được nhấn.

Đây có phải là lỗi trong bàn phím của UI UI hay tôi đang làm điều gì đó không chính xác?

Cảm ơn bạn đã hỗ trợ.


Đã cập nhật - nhờ câu trả lời nhất định, tôi đã thanh toán sau đây làm séc của mình. Này hoạt động tốt trên cả hai điện thoại tôi đã sẵn sàng để thử nghiệm (Sense UI và CyanogenMod CM7)

  if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) { 
       return false; 
      } 

      if (actionId != EditorInfo.IME_ACTION_NEXT && actionId != EditorInfo.IME_NULL) { 
       return false; 
      } 
+2

Không có câu trả lời cho bạn Tôi sợ, tôi chỉ muốn nói rằng tôi đã bị ảnh hưởng bởi vấn đề này ngày hôm nay. Tôi chưa bao giờ thấy bàn phím HTC Sense trước ngày hôm nay .. ugh!Và làm thế nào họ đã bỏ đi bằng cách bỏ qua cờ textNoSuggestions? Làm cho giao diện người dùng của tôi một chút sucky, thối chúng. –

+0

Tôi nhận thấy rằng rất nhiều ứng dụng không hoạt động tốt vì bàn phím của chúng không thực hiện nút mặc định (luôn là "Enter"). Điều này bao gồm các ứng dụng do Google cung cấp (bao gồm, tôi nghĩ rằng, quy trình đăng ký ban đầu). Nó có vẻ giống như một điều khá lớn cho HTC để bỏ qua. Đó là một sự xấu hổ, bởi vì tôi thực sự thích SenseUI hơn tất cả hơn Motoblur. Cảm ơn bạn đã xác nhận. – mbafford

Trả lời

26

Như Mitch nói, bạn phải kiểm tra các hoạt động sự kiện:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    if (event.getAction() != KeyEvent.ACTION_DOWN) 
     return false; 

    // do your stuff 

    return true; 
} 

đoạn này hoạt động trên cả hai giao diện người dùng Sense và giả lập.

+2

Điều này dường như gần như là câu trả lời, mặc dù trên điện thoại khác của tôi (chạy CyanogenMod CM7), "sự kiện" là vô giá trị khi tôi nhấn "Tiếp theo" trên bàn phím, vì vậy tôi cũng phải kiểm tra điều đó. – mbafford

+1

Tôi cũng đã thêm một số "if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED) trả về false;" cho phương pháp. – AlexVogel

0

thay vì gửi một hành động ime và null như một sự kiện, nó sẽ gửi một sự kiện liên lạc vì vậy nếu bạn không nhận được hành động đúng, bạn có thể kiểm tra sự kiện này cho action_up hoặc action_down

+1

Tôi không hiểu bạn đang nói gì ở đây. Có sự kiện nào hoạt động tốt trên cả giao diện người dùng Sense của HTC và các bàn phím khác thực hiện đúng hành động mặc định? – mbafford

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

Trả lại đúng; sau khi xử lý trường hợp ur và nó sẽ không thể được gọi là một lần nữa

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

       if (actionId == EditorInfo.IME_NULL) 
       { 
        Log.i("here","Add product "); 
        return true; //this does the trick 
       } 
       return false; 
      }  
1

Tôi nghĩ rằng nếu bạn trở thành sự thật, nó có nghĩa là bạn quan tâm đến phần còn lại của các sự kiện cho đến khi nó đạt đến IME_ACTION_DONE. Vì vậy, nếu bạn trả về false, điều đó có nghĩa là bạn không quan tâm đến các sự kiện và các chế độ xem khác sẽ có cơ hội xử lý nó. Vì bạn chỉ có 1 lượt xem, tôi khuyên bạn chỉ cần bỏ qua kiểm tra actionId và chỉ trả về false mỗi lần.

etMovieName = (EditText) view.findViewById(R.id.et_movie_name); 
etMovieName.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) { 
     System.out.println("actionId= "+ actionId); 
     performSearch(); 
     return false; 
    } 
}); 

Tình huống khác là nếu bạn có chế độ xem chồng chéo hoặc chế độ xem anh chị em, bạn có thể sử dụng actionId để chuyển thông tin xung quanh. Trong tình huống này, việc trả về true sẽ cho phép bạn chuyển thông tin sang chế độ xem khác. Nếu bạn thực sự quan tâm đến sự kiện/actionId (ví dụ nếu bạn có một cái nhìn anh chị em ruột), sau đó bạn có thể làm điều này:

etMovieName = (EditText) view.findViewById(R.id.et_movie_name); 

etMovieName.setImeOptions(EditorInfo.IME_ACTION_DONE); 
etMovieName.setSingleLine(); 

etMovieName.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) { 
     System.out.println("actionId= "+ actionId); 
     return performSearch();  } 
}); 

Thông báo giá trị actionId đã thay đổi tới 6 lần tôi nói thêm:

etMovieName.setImeOptions(EditorInfo.IME_ACTION_DONE); 
etMovieName.setSingleLine(); 
+1

Hành vi rất lạ, nhưng có vẻ như bạn chính xác. –

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