2012-01-07 1 views
16

Tôi có một EditText duy nhất trên bố cục của mình. Sau khi người dùng nhập một số văn bản và nhấn phím "đã hoàn thành", tôi muốn xóa con trỏ nhấp nháy khỏi nó. Tôi đã lùng sục StackOverflow và tìm thấy 3 câu trả lời không hiệu quả với tôi. Con trỏ nhấp nháy vẫn còn.Làm cách nào để xóa tiêu điểm khỏi EditText khi người dùng chỉnh sửa xong?

private class MyOnKeyListener implements OnKeyListener { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN 
    && keyCode == KeyEvent.KEYCODE_ENTER) { 
     // FAIL 0 
     MyActivity.this.findViewById(R.id.someOtherView).requestFocus(); 

     // FAIL 1 
     InputMethodManager imm = (InputMethodManager)getSystemService(
     Context.INPUT_METHOD_SERVICE 
    ); 
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 

     // FAIL 2 
     MyActivity.this.getWindow().setSoftInputMode(
     WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN 
    ); 

     return true; 
    } else { 
     return false; 
    } 
    } 
} 

Trả lời

23

Bạn có thể sử dụng một thuộc tính xml,

android:cursorVisible 

hoặc bạn có thể làm điều đó trong mã với phương pháp này.

setCursorVisible(boolean). 
+0

Điều này đã sửa nó. Nó cũng làm điều đúng bằng cách tiết lộ con trỏ khi bàn phím đang mở. Nó chỉ ẩn con trỏ khi bạn không chỉnh sửa nó. – JoJo

+0

WIsh Tôi có thể bỏ phiếu nhiều hơn khi tôi tìm thấy 10 câu trả lời phức tạp khác không hoạt động trước khi tìm thấy câu trả lời này. Cảm ơn. – Glenn

+0

Tôi gặp sự cố này: http://stackoverflow.com/questions/23677895/saving-an-edittext-to-bitmap ----- Với giải pháp này, ghim cũng bị ẩn! Nhưng tôi chỉ muốn che đường thẳng đứng. –

1

chỉ cần đặt trọng tâm vào nút Xong.

+1

Đó không phải là ví dụ 0 thất bại của anh ấy sao? – Dante

-1

nếu bạn không muốn nó có thể chỉnh sửa được, tôi sẽ nói như sau;

EditText orgid; 
orgid.setText(user.getOrgId()); 
orgid.setEnabled(false); 
2

Fail 0:

Calling .requestFocus() trên một số yếu tố bố trí là không đủ nếu phần tử là không thể đặt tiêu điểm trong chế độ cảm ứng. Nếu bạn muốn thiết lập focus cho một cái nhìn hoặc nút bạn phải gọi

.setFocusableInTouchMode(true); 

đầu tiên hoặc thiết lập nó trong .xml bạn

+0

Nó giải quyết được vấn đề cho tôi. Cám ơn! –

10

Sử dụng mã dưới đây để loại bỏ sự tập trung từ EditText

editText.setOnKeyListener(new OnKeyListener() { 
      public boolean onKey(View view, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_ENTER) { 
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0); 
        editText.setFocusable(false); 
        editText.setFocusableInTouchMode(true); 
        return true; 
       } else { 
        return false; 
       } 
      } 
     }); 
+0

tìm kiếm từ 2 ngày qua ... nhận được rất nhiều giải pháp .. không có gì hoạt động ... giải pháp của bạn tuyệt vời .. ty – Abhi

+1

URLText là gì? –

6

đây là EditText tùy chỉnh của tôi mà phát hiện xem bàn phím đang hiển thị & tự động loại bỏ tập trung khi bàn phím được giấu

/** 
* Created by TheFinestArtist on 9/24/15. 
*/ 
public class KeyboardEditText extends EditText { 

    public KeyboardEditText(Context context) { 
     super(context); 
    } 

    public KeyboardEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public KeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void setOnTouchListener(OnTouchListener l) { 
     super.setOnTouchListener(l); 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 
     if (listener != null) 
      listener.onStateChanged(this, true); 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK 
       && event.getAction() == KeyEvent.ACTION_UP) { 
      if (listener != null) 
       listener.onStateChanged(this, false); 

      // Hide cursor 
      setFocusable(false); 

      // Set EditText to be focusable again 
      setFocusable(true); 
      setFocusableInTouchMode(true); 
     } 
     return super.onKeyPreIme(keyCode, event); 
    } 

    /** 
    * Keyboard Listener 
    */ 
    KeyboardListener listener; 

    public void setOnKeyboardListener(KeyboardListener listener) { 
     this.listener = listener; 
    } 

    public interface KeyboardListener { 
     void onStateChanged(KeyboardEditText keyboardEditText, boolean showing); 
    } 
} 
+1

Điều này không hoạt động. Phương thức 'onKeyPreIme' không được gọi. – rkyr

+0

@rkyr tại sao? nó làm việc cho tôi, tôi đã thử một số thiết bị –

+0

@KirillVashilo, không thể nói bây giờ. Đã một thời gian kể từ khi tôi đối mặt với vấn đề đó. Có lẽ trên thiết bị KitKat – rkyr