Я пытаюсь отключить программную клавиатуру при использовании NumberPicker для ввода числовых значений (по эстетическим соображениям). Это мой layout-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. Любые идеи?
XML-версия ответа Эндрю Уэббера
пример
источник
Прочитав исходный код com / android / internal / widget / NumberPicker.java, я нашел следующее решение:
источник
Просто улучшил ответ @MaxVogler (так что если вы хотите проголосовать и за этот голос @MaxVogler) и сделайте его хакером. Также нам не нужно звонить
setOnFocusChangeListener
иsetInputType
. ТолькоsetFocusable
к ложному сделаю.Ниже приведен вспомогательный API для включения / выключения функции.
источник
Вот еще один способ сделать это, который позволяет пользователю по-прежнему редактировать число, если он хочет - он просто подавляет программную клавиатуру на начальном этапе. Используйте
NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
для подавления программной клавиатуры, когда интерфейс впервые отображается согласно ответам выше. Затем получите ваш диалог или действие для реализацииView.OnTouchListener
, вызовитеsetOnTouchListener(this)
свойNumberPicker
, и в вашей реализацииonTouch(View v,MotionEvent e)
сбросьте фокусируемость потомка Numberpicker до его нормального значения, затем верните false.Возвращение false означает, что касание все еще обрабатывается NumberPicker, что означает, что если пользователь нажимает на поле редактирования, появляется программная клавиатура. Это как раз то, что я хотел, столкнувшись с той же проблемой - когда программная клавиатура выводит диалоговое окно, когда оно появляется впервые, вызывает недовольство, поскольку оно сдвигает диалоговое окно вверх после его появления.
после создания диалога в
onCreateDialog()
методе и поиска NumberPicker:и вот метод OnTouch:
источник
Самым простым, что я нашел для работы, было:
источник
Если вы хотите скрыть программную клавиатуру только при загрузке представления с помощью средства выбора номера, но при этом хотите, чтобы пользователи могли редактировать после загрузки представления, то вам не следует блокировать возможность фокусировки по потомкам. Вместо этого просто не позволяйте сборщику чисел быть первым целевым элементом в вашем представлении.
Смотрите этот ответ для деталей.
Основываясь на ответе выше:
источник
Я не знаю, почему это работает, но настройка OnClickListener, которая ничего не делает, не позволяет клавиатуре показывать (Lollipop)
источник
* называя это:
не будет блокировать фокусируемость потомков (средство выбора номера будет редактируемым)
будет скрывать мягкий ввод при создании
before (обработка ввода) getValue () позволит получить правильное значение
источник
Рабочий код программно:
XML:
источник