2012-06-12 28 views
17

Để tất cả,NumberPicker trong AlertDialog luôn kích hoạt bàn phím. Làm thế nào để vô hiệu hóa điều này?

Tôi đang cố gắng để có được một NumberPicker đơn giản để làm việc trong một AlertDialog. Vấn đề là bất cứ khi nào tôi tăng/giảm giá trị trong trình đánh số, bàn phím sẽ kích hoạt.

Có nhiều bài đăng mô tả sự cố này, nhưng không có đề xuất nào hoạt động. Tôi đã thử:

android:configChanges="keyboard|keyboardHidden" 

inputManager.hideSoftInputFromWindow(currentView.getWindowToken(), 0); 

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

Tôi đã cố gắng kêu gọi các chức năng này trước và sau khi khởi tạo (dialog.show()), vào các sự kiện phím nhấn (sử dụng thính giả rõ ràng), vv nhưng không may mắn cho đến nay.

Các mã hoàn chỉnh:

popup.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
    /> 
</RelativeLayout> 

Và chức năng gọi điện thoại:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
View view = getLayoutInflater().inflate(R.layout.popup, null); 
builder.setView (view); 

final AlertDialog dialog = builder.create(); 
NumberPicker picker = (NumberPicker) view.findViewById(R.id.myNumber); 
picker.setMinValue(0); 
picker.setMaxValue(999); 

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

Bất kỳ giúp đánh giá cao

Barry

Trả lời

24

Thực ra, mặc dù giải pháp trên hoạt động hoàn hảo, có cách dễ dàng hơn.

picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 

Đây là tất cả những gì cần thiết. Dù sao, cảm ơn cho các bài trả lời !!!!:-)

+0

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

1

sự Thuộc tính android:configChanges thuộc về tệp Manifest.xml của bạn, không phải là bố cục. Nhưng nếu bạn đang ẩn bàn phím từ đó, bạn có lẽ tốt nhất của việc sử dụng

android:windowSoftInputMode="stateAlwaysHidden" 

Bạn cũng nên cố gắng sử dụng getWindow() trên Activity của bạn chứ không phải chỉ là Dialog và xem giúp. Đây có lẽ là giải pháp tốt nhất là giải pháp đầu tiên (ẩn từ tệp kê khai) sẽ giữ bàn phím ẩn trong toàn bộ Hoạt động.

+0

Xin chào Jave, Cảm ơn câu trả lời của bạn và hiểu biết của bạn về Manifest vs XMLs bố trí. Tuy nhiên, điều tôi không thể thêm các tham số này vào bố cục, vì bố cục về cơ bản là một biểu mẫu. Các numberpicker là một popup (alertdialog) trên mẫu này và tôi chỉ cần vô hiệu hóa bàn phím trên hộp thoại này, không phải toàn bộ hoạt động. Đây là những gì bạn đã menion theo cách :-) getWindow về hoạt động này là một cái gì đó tôi đã cố gắng và không may không giúp – barrel

3

Vì không có quyền truy cập vào các nút NumberPicker, nên không thể thực hiện.

Tôi đã thực hiện quá trình hack bẩn nhanh chóng để giải quyết vấn đề này.

Đầu tiên thêm tập trung ăn để bố trí, trong trường hợp này Nút với kích thước 0:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
     /> 
    <Button 
     android:id="@+id/myBtn" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     /> 
</RelativeLayout> 

Chúng ta cần phải nắm bắt sự kiện của cách nhấp vào nút incement/giảm, tôi đã chọn OnValueChangedListener, không thể tìm thấy một cái gì đó tốt hơn.

EditText edit = null; 
    try { 
     final Field[] fields = picker.getClass().getDeclaredFields(); 
     for (Field f : fields) { 
      if (EditText.class.equals(f.getType())) { 
       f.setAccessible(true); 
       edit = (EditText) f.get(picker); 
      } 
     } 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
    if (edit != null) { 
     final EditText finalEdit = edit; 
     final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker numberPicker, int i, int i1) { 
       dialog.findViewById(R.id.myBtn).requestFocusFromTouch(); 
       imm.hideSoftInputFromWindow(finalEdit.getWindowToken(), 0); 
      } 
     }); 
    } 

Đây không phải là giải pháp được khuyến nghị. Tôi hy vọng ai đó sẽ tìm thấy một cái gì đó tốt hơn. Chỉ sử dụng cho mục đích giáo dục ;-)

+0

Wow, hoạt động như một say mê! Cảm ơn rất nhiều :-) – barrel

0

XML:

<NumberPicker 
    ... 
    android:descendantFocusability="blocksDescendants" />