2011-06-22 50 views
18

Tôi đang sử dụng 4 EditText trường và 2 trình quay trong một hoạt động. Thứ tự của các thành phần này là 2 EditText, rồi 2 spinners và sau đó là 2 EditText trường.Spinner không lấy nét

Sự cố xảy ra khi tôi chuyển tiêu điểm (với sự trợ giúp của nút bàn phím mềm tiếp theo) từ EditText đến spinner, spinner không lấy nét và tiêu điểm được chuyển đến trường EditText tiếp theo được đặt sau spinners.

Tôi đã sử dụng requestfocus() trên spinner, nhưng nó không hoạt động.

Làm cách nào để đảm bảo máy quay được lấy nét?

+1

Vui lòng cấp cờ trả lời. – JJD

+1

Trừ 1 để không cấp câu trả lời đã chọn. –

Trả lời

3

Đây là ảnh chụp trong bóng tối, nhưng hãy thử đặt thuộc tính có thể lấy nét (bằng XML hoặc mã; bất kỳ cách nào bạn đang thực hiện) thành true trên spinner.

http://developer.android.com/reference/android/view/View.html#attr_android:focusable

EDIT: Ngoài ra, xem câu hỏi này: Can't manage to requestFocus a Spinner

+0

thanx tôi đã giải quyết bằng cách làm như sau: 1) Tôi đặt đối tượng Spinner trên đầu (Trong phương thức onCreate) chỉ để đảm bảo rằng mã của tôi được thực thi trước. 2) Tôi đã sử dụng các mục sau: Spinner s1 = (Spinner) findViewById (R.id.spinner1); s1.setFocusable (true); s1.setFocusableInTouchMode (true); – Shameen

+1

@Shameen Bạn có thể đã thiết lập những cờ đó trong XML. –

19

Cảm ơn, tôi đã giải quyết bằng cách làm như sau:

  1. tôi đặt đối tượng Spinner trên đầu (trong phương pháp onCreate) chỉ để đảm bảo rằng mã của tôi được thực thi trước tiên
  2. Tôi đã sử dụng như sau:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1); 
    s1.setFocusable(true); 
    s1.setFocusableInTouchMode(true); 
    s1.requestFocus(); 
    
+0

Bạn đã có giải pháp rõ ràng từ @shanet vì vậy bạn nên chọn câu trả lời của họ. –

31

Tôi đã tìm được giải pháp khác rồi định vị lại Spinner của mình. Trong EditText trước spinner, thêm người nghe này:

editTextBefore.setOnEditorActionListener(new OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView textView, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_NEXT) { 
      hideKeyboard(); 
      textView.clearFocus(); 
      spinner.requestFocus(); 
      spinner.performClick(); 
     } 
     return true; 
    } 
}); 

Bạn cũng cần phải thêm các dòng để spinner thể nhận được tập trung:

spinner.setFocusable(true); // can be done in XML preferrable 

chức năng hideKeyboard tôi chỉ là một chi tiết hình ảnh mà Tôi muốn thêm để bàn phím bị ẩn:

private void hideKeyboard() { 
    InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 
      InputMethodManager.HIDE_NOT_ALWAYS); 
} 

Hy vọng tôi đã giúp trong câu hỏi phức tạp này.
Cờ InputMethodManager.HIDE_NOT_ALWAYS có thể là found in the documentation.

+1

Bạn không phải đặt focusableInTouchMode? –

+0

Sẽ rất hữu ích khi đặt focusableInTouchMode. Ngoài ra, nó dường như không hoạt động nếu bạn thử điều này trong XML, hãy thử lập trình. –

+0

Cảm ơn tuyệt vời !!!! –

0

Tôi vừa gặp sự cố tương tự. Tôi đã giải quyết nó bằng cách sử dụng thuộc tính nextFocusDown/Up/Left/Right.

<EditText 
    android:id="@+id/tPhone" 
    ... 
    android:focusableInTouchMode="true" 
    android:focusable="true" 
    android:nextFocusDown="@+id/sCountry"/> 

<Spinner 
    android:id="@+id/sCountry" 
    .... 
    android:focusableInTouchMode="true" 
    android:focusable="true" 
    android:nextFocusUp = "@+id/tPhone" 
    android:nextFocusDown="@+id/tStreet"/> 

<EditText 
    android:id="@+id/tStreet" 
    ... 
    android:visibility="gone" 
    android:focusableInTouchMode="true" 
    android:focusable="true" 
    android:nextFocusUp = "@+id/sCountry"/> 

Nhưng tại sao điều này thậm chí còn cần thiết ... đánh bại tôi.

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