133

Tôi đang cố tắt bàn phím mềm khi sử dụng NumberPicker để nhập các giá trị số (vì lý do thẩm mỹ). Đây là layout-xml-mã của tôi:Tắt bàn phím ảo trên NumberPicker

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/linearLayout2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginBottom="30dp" 
     android:layout_marginTop="30dp" > 

     <NumberPicker 
      android:id="@+id/repetitionPicker" 
      android:layout_width="40dp" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:text="@string/repetitions_short_divider" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 

     <NumberPicker 
      android:id="@+id/weightPicker" 
      android:layout_width="40dp" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="40dp" /> 

     <TextView 
      android:id="@+id/textView2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:text="@string/pounds" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 
    </LinearLayout> 


    <Button 
     android:id="@+id/saveButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:text="@string/save" /> 

</LinearLayout> 

Và cuối cùng đây là mã nơi tôi cố gắng để ngăn chặn bàn phím trong onCreate() - Phương pháp:

// hide keyboard 
View.OnClickListener disableKeyBoardListener = new View.OnClickListener() { 
    public void onClick(View v) { 
     ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)) 
       .hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
    } 
}; 

((EditText) weightPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL); 
((EditText) repetitionPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL); 

((EditText) weightPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener); 
//((EditText) repetitionPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener); 
//weightPicker.setOnClickListener(disableKeyBoardListener); 
//repetitionPicker.setOnClickListener(disableKeyBoardListener);  

getWindow().setSoftInputMode(
     WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Đáng buồn thay, bàn phím mềm vẫn hiển thị khi nhấp vào một NumberPicker. Ý tưởng nào?

Trả lời

380

Chỉ cần thấy điều này và nó hoạt động như một nét duyên dáng:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Bạn cũng có thể thiết lập này trong XML:

android:descendantFocusability="blocksDescendants" 
+1

Trừ khi tôi bỏ sót điều gì đó, điều này sẽ loại bỏ khả năng nhập giá trị cho NumberPicker. Nó không nhất thiết phải là một điều xấu, tùy thuộc vào cách bạn đang sử dụng bộ chọn, nhưng nó dường như là một hạn chế của giải pháp. – frenziedherring

+67

Bạn cũng có thể thiết lập điều này trong XML: android: descendantFocusability = "blocksDescendants" –

+1

Aaah, blocksDescendants, ofcourse. Cảm ơn bạn rất nhiều :) – Lev

6

Sau khi đọc qua android/widget đang com// nội/NumberPicker.java nguồn tôi đã nhận các giải pháp sau đây:

// Hide soft keyboard on NumberPickers by overwriting the OnFocusChangeListener 
OnFocusChangeListener fcl = new OnFocusChangeListener() { 
    public void onFocusChange(View v, boolean hasFocus) { 
     // Do nothing to suppress keyboard 
    } 
}; 

((EditText) numberPicker.getChildAt(1)).setOnFocusChangeListener(fcl); 

// Suppress soft keyboard from the beginning 
((EditText) numberPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL); 
+0

Vâng loại hình này của một hack phải không? – havexz

+0

Có, tôi phải chỉnh sửa trực tiếp chế độ xem con của NumberPicker. API Android đôi khi rất thưa thớt. – damaxxed

+0

+1 để tìm hack ... :) – havexz

6

Chỉ cần tăng cường ans các 's @MaxVogler (vì vậy nếu wannt bỏ phiếu bình chọn này @MaxVogler cũng vậy) và biến nó thành một bản hack mạnh mẽ. Ngoài ra, chúng tôi không cần gọi số setOnFocusChangeListenersetInputType. Chỉ setFocusable để sai sẽ làm.

Dưới đây là một api helper để bật/tắt tính năng

public static void enableNumberPickerManualEditing(NumberPicker numPicker, 
     boolean enable) { 
    int childCount = numPicker.getChildCount(); 

    for (int i = 0; i < childCount; i++) { 
     View childView = numPicker.getChildAt(i); 

     if (childView instanceof EditText) { 
      EditText et = (EditText) childView; 
      et.setFocusable(enable); 
      return; 
     } 
    } 
} 
3

Đây là một cách khác để làm điều đó cho phép thứ người dùng điện tử vẫn chỉnh sửa số nếu họ muốn - nó chỉ tắt bàn phím mềm ban đầu. Sử dụng NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS) để chặn bàn phím mềm khi giao diện hiển thị lần đầu tiên theo câu trả lời ở trên. Sau đó, để hộp thoại hoặc hoạt động của bạn triển khai View.OnTouchListener, hãy gọi setOnTouchListener(this) trên NumberPicker và trong việc triển khai onTouch(View v,MotionEvent e) đặt lại khả năng lấy nét con cháu của con số thành giá trị thông thường, sau đó trả về false.

Trả về sai nghĩa là chạm vẫn được xử lý bởi NumberPicker, có nghĩa là nếu người dùng chạm vào hộp chỉnh sửa, bàn phím mềm sẽ xuất hiện. Điều này xảy ra là chính xác những gì tôi muốn phải đối mặt với cùng một vấn đề - có bàn phím mềm đi lên với hộp thoại khi nó lần đầu tiên cho thấy là không hài lòng vì nó thay đổi hộp thoại sau khi nó xuất hiện.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener { 

sau khi tạo Dialog trong phương pháp onCreateDialog() và tìm NumberPicker:

m_oldFocus = m_numberpicker.getDescendantFocusability(); 
m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 
m_numberpicker.setOnTouchListener(this); 

và đây là phương pháp OnTouch:

public boolean onTouch(View v, MotionEvent event) { 
    m_numberpicker.setDescendantFocusability(m_oldFocus); 
    return false; 
} 
+0

chỉ điều này đã giúp tôi giải quyết vấn đề của mình, cảm ơn vì cách tiếp cận của bạn – smoothumut

2

Cách đơn giản nhất tôi tìm thấy công việc là:

numberPicker    = (NumberPicker) myDialogView.findViewById(R.id.myViewId); 
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0); 
numberPickerChild.setFocusable(false); 
numberPickerChild.setInputType(InputType.TYPE_NULL); 
+0

Cảm ơn rất nhiều !!! Tôi đã thử tất cả mọi thứ mà không có kết quả, nhưng điều này hoạt động tốt ... – Christian

0
/** 
* set focus to top level window 
* disposes descendant focus 
* disposes softInput 
* @param context - activity context 
* @param enable - state of focus 
* */ 
public static void topLevelFocus(Context context, boolean enable){ 
    if(Activity.class.isAssignableFrom(context.getClass())){ 
     ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView(); 
     if(tlView!=null){ 
      tlView.setFocusable(enable); 
      tlView.setFocusableInTouchMode(enable); 
      tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 
      tlView.requestFocus(); 
     } 
    } 
} 

* gọi này:

  • sẽ không chặn hậu duệ focusability (numberpicker sẽ được chỉnh sửa)

  • sẽ giấu đầu vào mềm trên tạo

  • trước (xử lý đầu vào) getValue() sẽ cho phép nhận walue thích hợp


47

phiên bản Xml của câu trả lời Andrew Webber của

android:descendantFocusability="blocksDescendants" 

Ví dụ

<NumberPicker 
     android:id="@+id/your_numberpicker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:descendantFocusability="blocksDescendants"/> 
Các vấn đề liên quan