Отключить мягкую клавиатуру на NumberPicker

Я пытаюсь деактивировать мягкую клавиатуру при использовании NumberPicker для ввода числовых значений (по эстетическим соображениям). Это мой макет-xml-код:

<?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. Есть идеи?

Solutions Collecting From Web of "Отключить мягкую клавиатуру на NumberPicker"

Просто нашел это, и он работает как шарм:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Вы также можете установить это в XML:

 android:descendantFocusability="blocksDescendants" 

Xml-версия ответа Эндрю Уэббера

 android:descendantFocusability="blocksDescendants" 

пример

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

После прочтения исходного кода com / android / internal / widget / 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); 

Просто увеличьте ансамбли @MaxVogler (так что если проголосовать за это голосование @MaxVogler тоже) и сделать его надежным взломом. Также нам не нужно вызывать setOnFocusChangeListener и setInputType . Будет использоваться только setFocusable to false.

Ниже приведена вспомогательная функция 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; } } } 

Вот еще один способ сделать это, что позволяет пользователю по-прежнему редактировать номер, если захочет – он просто подавляет мягкую клавиатуру. Используйте NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS) для подавления мягкой клавиатуры, когда интерфейс сначала показывает в соответствии с приведенными выше ответами. Затем запустите свой диалог или активность для реализации View.OnTouchListener , вызовите setOnTouchListener(this) на вашем NumberPicker , а в вашей реализации onTouch(View v,MotionEvent e) сбросьте фокусность потомка с цифровым именем до его нормального значения, а затем верните 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; } 

Самое простое, что я нашел для работы:

 numberPicker = (NumberPicker) myDialogView.findViewById(R.id.myViewId); EditText numberPickerChild = (EditText) numberPicker.getChildAt(0); numberPickerChild.setFocusable(false); numberPickerChild.setInputType(InputType.TYPE_NULL); 
 /** * 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 будет редактироваться)

  • Скроет мягкий вход для создания

  • Before (обработка ввода) getValue () позволит получить правильную сумму