Intereting Posts
Android: EfficientAdapter с двумя разными видами Использовать локальную базу данных в Xamarin Что означает «включить API хранения DOM»? Android 4.1 – RTSP с использованием VideoView и MediaController Получение / изменение кадров во время записи mp4 с помощью MediaRecorder Android: получить текущее местоположение пользователя без использования gps или Интернета Дисковод API-интерфейса и интеграция с Дисковым приложением IBeacons – Компания (Estimote, Gimbal и т. Д.) SDKs против библиотеки Android / iOS Какое событие увольняется после того, как все взгляды полностью вычеркнуты? JmDNS: невозможно разрешить службу Не удалось создать мост отладки Не удалось обнаружить версию adb. Синтаксическая ошибка: ")" Обновление платформ-инструментов с 23.0.1 по 23.1.0 Линукс-32 бит вызывает проблему Как выбросить исключение, если метод выполняется из основного потока Вращение изображений на Android. Есть ли способ лучше? Есть ли способ заставить WebView обновлять его изображение (просмотр) при прокрутке? Обновление EditText с помощью Espresso

Поймать клавиатуру «Готово» для NumberPicker

У меня есть AlertDialog с некоторым текстом, NumberPicker , OK и Cancel.

 package org.dyndns.schep.example; import android.os.Bundler; import android.view.View; import android.widget.NumberPicker; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; public class FooFragment extends DialogFragment { @Override public void onAttach(Activity activity) { super.onAttach(activity); mParent = (MainActivity) activity; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { mParent.setFoo(foo()); } }) .setNegativeButton(android.R.string.cancel, null); View view = getActivity().getLayoutInflater.inflate( R.layout.dialog_foo, null); mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1); mPicker.setValue(mParent.getFoo()); builder.setView(view); return builder.create(); } public int foo() { return mPicker.getValue(); } private MainActivity mParent; private NumberPicker mPicker; } 

(Этот диалог еще не делает того, что должно сохранить состояние при паузе и возобновлении, я знаю.)

Я бы хотел, чтобы действие «Готово» на мягкой клавиатуре или другом IME отклоняло диалоговое окно, как если бы нажали «ОК», так как есть только один виджет для редактирования.

Похоже, что лучший способ справиться с IME «Готово» – это, как правило, setOnEditorActionListener в TextView . Но у меня нет какой-либо переменной TextView , и NumberPicker явно не выставляет никаких NumberPicker или аналогичных NumberPicker редактора. (Может быть, NumberPicker содержит TextView с постоянным идентификатором, который я мог бы найти с помощью findViewById ?)

NumberPicker.setOnValueChangedListener запускается при действии «Готово», но также срабатывает при нажатии или щелчке списка номеров, что определенно не должно отменять диалог.

Основываясь на этом вопросе, я попытался проверить setOnKeyListener , но этот интерфейс вообще не срабатывал при использовании мягкой клавиатуры. Не удивительно, так как документация KeyEvent предполагает, что это означает больше для аппаратных событий, а в последних API-интерфейсах мягкая клавиатура не отправит их вообще.

Как я могу подключить IME «Готово» к действию «ОК» моего диалога?

Изменить: из внешнего вида источника макет NumberPicker содержит EditText , но его id id/numberpicker_input в пакете com.android.internal . Использование этого было бы нелегко и, очевидно, было бы обескуражено. Но похоже, что могут быть только ручные способы получить поведение, которое я хочу.

Solutions Collecting From Web of "Поймать клавиатуру «Готово» для NumberPicker"

Как я могу подключить IME «Готово» к действию «ОК» моего диалога?

Проблема в том, что вы не можете передавать события IME, если у вас нет набора слушателей в TextView который в настоящее время работает с IME. Один из способов сделать то, что вы хотите, – это NumberPicker нашу собственную логику к NumberPicker , который работает с IME (как вы уже говорили в последней части вашего вопроса). Чтобы избежать использования определенных идентификаторов или других трюков компоновки (что может быть проблематично), чтобы завладеть этим виджетами, вы можете использовать жадную тактику, устанавливая слушателя на любой виджет из NumberPicker который может вызвать желаемое событие ( TextViews или любой подкласс TextView ). Что-то вроде этого:

  private AlertDialog mCurrentDialog; private List<TextView> mTargets = new ArrayList<TextView>(); private OnEditorActionListener mListener = new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { // if a child of NumberPicker triggers the DONE editor event // get a reference to the positive button(which you use in your // code) and click it mCurrentDialog.getButton(Dialog.BUTTON_POSITIVE).performClick(); } return false; } }; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // ... mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1); mPicker.setValue(mParent.getFoo()); // clear any previous targets mTargets.clear(); // find possible targets in the NumberPicker findTextViews(mPicker); // setup those possible targets with our own logic setupEditorListener(); builder.setView(view); // get a reference to the current showed dialog mCurrentDialog = builder.create(); return mCurrentDialog; } 

Где методы:

 private void findTextViews(ViewGroup parent) { final int count = parent.getChildCount(); for (int i = 0; i < count; i++) { final View child = parent.getChildAt(i); if (child instanceof ViewGroup) { findTextViews((ViewGroup) child); } else if (child instanceof TextView) { mTargets.add((TextView) child); } } } private void setupEditorListener() { final int count = mTargets.size(); for (int i = 0; i < count; i++) { final TextView target = mTargets.get(i); target.setOnEditorActionListener(mListener); } } 

Другое возможное (и разумное) решение (например, Naveen, о котором уже упоминалось в его комментарии) – использовать один из портов класса NumberPicker (или изменить его из SDK) и вставить свои собственные идентификаторы виджетов (которые Ссылка на виджет простая задача). Это было бы проще реализовать сейчас, но неудобно поддерживать в долгосрочной перспективе.

Мои поиски и эксперименты также оказались пустыми руками. Тем не менее я не буду поощрять такое поведение, поскольку это не имеет большого смысла.

Если вам нужен NumberPicker, это потому, что вы хотите, чтобы функция прокрутки соответствовала требуемому значению, а не вводить его (хотя это возможно). Если вы хотите ввести значение, которое вы используете EditText, и вы сможете без проблем реализовать то, что вам нужно.

В качестве альтернативы вам нужно скопировать реализацию NumberPicker из источника, а затем изменить ее в соответствии с вашими потребностями (fx, добавив параметры ime).