2012-12-20 18 views
17

Trong hoạt động của tôi, tôi có trường editText. Khi người dùng chạm vào nó, editText sẽ lấy nét và bàn phím xuất hiện. Bây giờ, khi người dùng nhấn nút quay lại phần cứng trên điện thoại, bàn phím sẽ biến mất nhưng con trỏ vẫn ở trong Edittext, i. e., nó vẫn có trọng tâm. Có thể làm cho EditText mất tập trung khi nhấn nút quay lại không? Tôi đã cố gắng sử dụng đoạn mã sau nhưng nó đã không làm việc:làm cho editText mất tập trung vào báo chí trở lại

@Override 
public void onBackPressed() { 
    vibrator.vibrate(Constants.DEFAULT_VIBRATE_TIME); 
    myEditText.clearFocus(); 
      super.onBackPressed(); 
} 
+1

đảm bảo myEditText không phải là phần tử đầu vào đầu tiên trong bố cục của bạn.if có thì trước tiên hãy xóa Focus khỏi EditText và sau đó tập trung vào bất kỳ phần tử nào khác như TextView v.v. –

+0

Đó là yếu tố đầu vào đầu tiên trong hoạt động của tôi. Tôi đã thử 'title.requestFocus()' nhưng nó không hoạt động tiêu đề – Ankush

+0

đầu tiên làm tiêu đề có thể lấy nét sau đó gọi tiêu đề .requestFocus() –

Trả lời

2

Bạn có thể thực hiện một số Views thể đặt tiêu điểm của bạn, ví dụ như một ImageView. Đảm bảo đặt tiêu điểm ở chế độ cảm ứng, sử dụng setFocusableInTouchMode(true) và trên onResume() làm cho rằng View thành requestFocus().

Bạn cũng có thể tạo giả View với 0 kích thước và thực hiện các bước tương tự được mô tả ở trên.

Tôi hy vọng điều này sẽ hữu ích.

+4

mùi giống như một hack ... –

+0

onresume không bị sa thải khi bàn phím đóng – PrisonMike

0

Add xem như sau cao hơn EditText của bạn:

<LinearLayout 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:focusable="true" 
    android:focusableInTouchMode="true" /> 

Cũng để ẩn bàn phím thêm này trong onBackPressed():

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 
11

Chỉ cần mở rộng EditText:

public class EditTextV2 extends EditText 
{ 
    public EditTextV2(Context context) 
    { 
     super(context); 
    } 

    public EditTextV2(Context context, AttributeSet attribute_set) 
    { 
     super(context, attribute_set); 
    } 

    public EditTextV2(Context context, AttributeSet attribute_set, int def_style_attribute) 
    { 
     super(context, attribute_set, def_style_attribute); 
    } 

    @Override 
    public boolean onKeyPreIme(int key_code, KeyEvent event) 
    { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 
      this.clearFocus(); 

     return super.onKeyPreIme(key_code, event); 
    } 
} 

Và trong xml chỉ cần sử dụng <yourPackage.EditTextV2> thay vì <EditText>.

Lưu ý: Bạn có thể cần thêm/xóa các hàm tạo cho lớp này tùy thuộc vào API tối thiểu mà bạn đang hỗ trợ. Tôi đề nghị chỉ cần thêm tất cả và loại bỏ những người có cuộc gọi super() được gạch dưới màu đỏ.

+0

Nếu chúng ta sử dụng hàm tạo: 'EditText (Ngữ cảnh ngữ cảnh, AttributeSet attrs, int defStyleAttr, int defStyleRes) 'yêu cầu API tối thiểu là 21 [EditText] (https://developer.android.com/reference/android/widget/EditText.html) – ArtiomLK

+1

Giải pháp hoàn hảo thanh lịch. Hữu ích khi bạn cần ghi đè hành vi nút quay lại bằng cách sử dụng các đoạn bằng cách sử dụng 'View.OnKeyListener' và cần nắm bắt sự kiện nhấp vào nút quay lại trong khi EditText lấy nét tập trung ngắt việc triển khai của bạn. Chúc mừng! – mwieczorek

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