Android: пользовательская клавиатура для складного вида действий на панели действий? - PullRequest
0 голосов
/ 30 марта 2012

Я добавил собственный ActionView на свою панель действий, и он предназначен для того, чтобы пользователи могли что-то искать, вводя число. Однако EditText, который я использовал для макета, всегда вызывает полную буквенно-цифровую клавиатуру, даже если я указал imeType для числа. Я не хочу буквенно-цифровую клавиатуру. Черт возьми, я даже не хочу опции типа +/-. Просто 0-9 и "Готово". Как я могу иметь свой EditText для поиска, используя пользовательскую клавиатуру? Есть ли способ сделать выпадающую клавиатуру? Я надеялся написать собственный IME только для этого поля, но, похоже, это не разрешено.

XML для меню:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/menu_keypad"
        android:icon="@drawable/ms_btn_keypad_sel"
        android:title="Keypad"
        android:showAsAction="ifRoom|collapseActionView"
        android:actionLayout="@layout/keypad_actionview"/>
</menu>

XML для макета действия:

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/keypad_actionview"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:textColor="@color/White"
      android:drawableLeft="@drawable/icon_channel_keypad"
      android:drawablePadding="5dp"
      android:inputType="number"
      android:imeOptions="flagNoExtractUi"
      />

Java для настройки меню панели действий:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.number_menu, menu);
    keypadMenuItem = menu.findItem(R.id.menu_keypad);
    final EditText keypadText = (EditText) keypadMenuItem.getActionView();
    keypadText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(final TextView textView, final int i, final KeyEvent keyEvent) {
            keypadMenuItem.collapseActionView();
            changeDisplayedNumber(Integer.valueOf(textView.getText().toString()), true);
            textView.setText("");
            return true;
        }
    });
    keypadMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            startAutoHidePlayerControlsRunner();
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            stopAutoHidePlayerControlsRunner();
            keypadText.setText("");
            keypadText.requestFocus();
            /*keypadText.setInputType(InputType.TYPE_CLASS_NUMBER);
            InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            if (inputMethodManager != null) {
                inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
            }*/
            return true;  // Return true to expand action view
        }
    });

    return true;
}

Закомментированный код в конце java должен был попытаться заставить клавиатуру отображаться сразу, но это вызывало некоторое странное поведение - выскакивали нечисловые клавиатуры.

1 Ответ

1 голос
/ 30 марта 2012

Я понимаю, что это проблема ввода по умолчанию с клавиатуры Asus

Да, Transformer Prime, похоже, несколько не решен по этой проблеме.При этом имейте в виду, что ни один IME не обязательно будет соблюдать любой данный inputType.Например, все граффити IME основаны на ручках и поэтому, вероятно, не имеют реального понятия «число» или «текст».inputType - это запрос, а не контракт.

Могу ли я принудительно поменять другой метод ввода

Нет.В этом есть некоторый неприятный потенциал для вредоносного ПО, если бы это было возможно.

Есть ли умный способ сделать так, чтобы actionView имел текст редактирования в панели действий и пользовательскую клавиатуру в выпадающем меню / внизу

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

...