133

我試圖在使用NumberPicker輸入數值(出於美學原因)時停用軟鍵盤。這是我的佈局的XML代碼:禁用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> 

最後這正是我試圖阻止鍵盤在OnCreate()的代碼 - 方法:

// 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); 

可悲的是,軟鍵盤依舊當點擊一個NumberPicker時出現。有任何想法嗎?

回答

380

剛剛發現這一點,它的工作原理就像一個魅力:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

您還可以設置這XML:

android:descendantFocusability="blocksDescendants" 
+1

除非我遺漏了一些東西,否則這將無法輸入NumberPicker的值。這不一定是壞事,這取決於你如何使用選擇器,但它似乎是解決方案的限制。 – frenziedherring 2013-08-26 17:01:52

+67

你也可以在XML中設置:android:descendantFocusability =「blocksDescendants」 – 2013-08-29 08:21:19

+1

Aaah,blocksDescendants,ofcourse。非常感謝:) – Lev 2016-03-30 07:27:09

6

通過COM /安卓/內部/空間/ NumberPicker.java源代碼,我到下面的解決方案看完:

// 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

那麼它的類型的黑客吧? – havexz 2012-01-17 21:24:13

+0

是的,我不得不直接編輯NumberPicker的子視圖。有時Android API非常稀少。 – damaxxed 2012-01-21 04:37:01

+0

+1找到破解... :) – havexz 2012-01-21 05:35:26

6

只是提高了@MaxVogler的ANS(所以如果wannt投這一票@MaxVogler),並使其成爲一個強大的黑客。我們也不需要撥打setOnFocusChangeListenersetInputType。只有setFocusable纔會做假。

下面是一個輔助的API來啓用/禁用該功能

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

下面是另一種方法來實現它如果用戶想要,用戶仍然要編輯一個號碼 - 它只是最初抑制軟鍵盤。使用NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)可以在界面首次按照上述答案顯示時抑制軟鍵盤。然後讓你的對話框或活動執行View.OnTouchListener,在你的NumberPicker上調用setOnTouchListener(this),並在你的onTouch(View v,MotionEvent e)執行onTouch(View v,MotionEvent e)重置numberpicker後裔聚焦能力爲其正常值,然後返回false。

返回false意味着觸摸仍由NumberPicker處理,這意味着如果用戶點擊編輯框,軟鍵盤就會出現。這正好是我想要面對的同樣的問題 - 讓軟鍵盤在第一次顯示時出現對話框,令人不快,因爲它在對話框出現後將它移開。

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener { 

onCreateDialog()方法創建對話框,找到NumberPicker後:

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

和這裏的OnTouch方法:

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

只有這一個幫助我解決了我的問題,謝謝你的方法 – smoothumut 2015-12-30 09:23:46

2

我發現工作最簡單的是:

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

非常感謝!我嘗試了一切都沒有結果,但這工作正常... – Christian 2015-09-10 21:11:39

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(); 
     } 
    } 
} 

*調用此:

  • 不會阻止後代可聚焦性(numberpicker會編輯)

  • 將隱藏軟輸入(先處理輸入創建

  • )getValue()將允許獲得正確的walue


47

安德魯·韋伯的回答

android:descendantFocusability="blocksDescendants" 

實例的XML版本

<NumberPicker 
     android:id="@+id/your_numberpicker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:descendantFocusability="blocksDescendants"/>