раскладка клавиатуры андроид по умолчанию

Я разрабатываю приложение для nexus 7, и мне нужно, чтобы EditText отображал вид клавиатуры с цифрами и специальными символами. Я знаю, что вы можете установить макет для EditText с помощью inputType, но моя проблема в том, что если я устанавливаю inputType = "number", появляется панель набора и невозможно переключиться на представление символов. Все, что мне нужно (это просьба клиента), это открыть клавиатуру с раскладкой, отображаемой при нажатии на клавишу «123» в левом нижнем углу. Я пробовал все комбинации setRawInputType и setInputType безуспешно. Эта комбинация показывает панель набора

txtLineCode.setInputType(InputType.TYPE_CLASS_TEXT);
txtLineCode.setRawInputType(InputType.TYPE_CLASS_NUMBER);

эта комбинация также показывает панель набора номера

txtLineCode.setInputType(InputType.TYPE_CLASS_TEXT);
txtLineCode.setRawInputType(InputType.TYPE_NUMBER_VARIATION_NORMAL|InputType.TYPE_CLASS_NUMBER);

Вот скриншоты, чтобы лучше объяснить, что мне нужно

это клавиатура по умолчанию

это клавиатура по умолчанию

это макет, который отображается, когда я нажимаю «? 123», и это то, что мне нужно показать по умолчанию это  макет отображается, когда я нажимаю ?123

это макет, показанный, если я установил inputType="number", который не позволяет переключаться на макет лекторов введите описание изображения здесь

На данный момент некоторые EditText в основном состоят из чисел, но должны содержать числа, что я могу сделать?

огромное спасибо


person Apperside    schedule 25.07.2013    source источник
comment
Имейте в виду, что если вы заработаете (в чем я сомневаюсь), пользователи могут установить разные клавиатуры с совершенно другим поведением.   -  person Siebe    schedule 25.07.2013
comment
Да, я знаю, но моя цель - обеспечить правильное поведение со стандартной клавиатурой. Почему вы сомневаетесь, что он заработает?   -  person Apperside    schedule 25.07.2013
comment
Если вы заставите его отображать ключи под? 123, что должно помешать пользователю переключиться обратно. Попробуйте пользовательскую клавиатуру stackoverflow.com /вопросы/9577304/   -  person Daniel S. Fowler    schedule 25.07.2013
comment
Мне не нужно останавливать обратное переключение пользователя, мне нужно разрешить переключение, но клиент хочет по умолчанию использовать ключи под ?123, потому что значения являются числами в 95% случаев, но также могут содержать буквы   -  person Apperside    schedule 25.07.2013
comment
Возможно, вы сможете просто отправить нажатие клавиши на клавиатуру с этим конкретным кодом клавиши. Не совсем лучшее решение, но оно может сработать.   -  person user2483079    schedule 25.07.2013
comment
@user2483079 user2483079 это хорошее, но не лучшее решение, вы знаете, как я могу это сделать?   -  person Apperside    schedule 25.07.2013
comment
В моем модульном тестировании я делал что-то вроде этого: myEditText.requestFocus(); myEditText.onEditorAction(KeyEvent.KEYCODE_ENTER); Это чтобы нажать кнопку энтер, я не уверен, как называется та клавиша, которую вы хотите, я поковыряюсь.   -  person user2483079    schedule 25.07.2013
comment
Есть один, который называется KEYCODE_SWITCH_CHARSET, не уверен, что это он, но вы можете попробовать.   -  person user2483079    schedule 25.07.2013


Ответы (1)


Я думаю, что нашел довольно элегантное решение: я использовал Drawable в текстовом поле (в моем случае drawableRight) и назначил прослушиватель кликов только на drawable, который выполняет переключение между числовым и текстовым режимом. Я могу назначить слушателя только для рисования, используя небольшой трюк, взятый из Обработка событий щелчка по рисунку в EditText :

public class MyEdittextextends EditText {

    private Drawable drawableRight;
    private Drawable drawableLeft;
    private Drawable drawableTop;
    private Drawable drawableBottom;


//YOUR STUFF HERE

@Override
    public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {
        if (right != null) {
            drawableRight = right;
        }

        if (left != null) {
            drawableLeft = left;
        }
        super.setCompoundDrawables(left, top, right, bottom);
    }
View.OnClickListener _leftDrawableClickListener = null;
View.OnClickListener _rightDrawableClickListener = null;

public void setLeftDrawableClickListener(View.OnClickListener clickListener) {
    _leftDrawableClickListener = clickListener;
}

public void setRightDrawableClickListener(View.OnClickListener clickListener) {
    _rightDrawableClickListener = clickListener;
}

@Override
    public boolean onTouchEvent(MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            int x, y;
            Rect bounds;
            x = (int) event.getX();
            y = (int) event.getY();
            // this works for left since container shares 0,0 origin with bounds
            if (drawableLeft != null) {
                bounds = drawableLeft.getBounds();
                if (bounds.contains(x - fuzz, y - fuzz)) {
                    try {
                        _leftDrawableClickListener.onClick(this);
                    } catch (Exception e) {
                    }
                    if (consumeEvent) {
                        event.setAction(MotionEvent.ACTION_CANCEL);
                        return false;
                    }
                }
            } else if (drawableRight != null) {
                bounds = drawableRight.getBounds();
                if (x >= (this.getRight() - bounds.width() - fuzz) && x <= (this.getRight() - this.getPaddingRight() + fuzz) && y >= (this.getPaddingTop() - fuzz) && y <= (this.getHeight() - this.getPaddingBottom()) + fuzz) {

                    try {
                        _rightDrawableClickListener.onClick(this);
                    } catch (Exception e) {
                    }
                    if (consumeEvent) {
                        event.setAction(MotionEvent.ACTION_CANCEL);
                        return false;
                    }
                }
            } else if (drawableTop != null) {
                // not implemented yet
            } else if (drawableBottom != null) {
                // not implemented yet
            }
        }

        return super.onTouchEvent(event);
    }


@Override
    protected void finalize() throws Throwable {
        drawableRight = null;
        drawableBottom = null;
        drawableLeft = null;
        drawableTop = null;
        super.finalize();
    }

}

После создания пользовательского EditText я использовал этот код в своей деятельности.

myEdittext = (EditText) findViewById(R.id.myEdittext);
        myEdittext.setRightDrawableClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (myEdittext.getInputType() != InputType.TYPE_CLASS_TEXT) {
                    myEdittext.setInputType(InputType.TYPE_CLASS_TEXT);
                    myEdittext.setRawInputType(InputType.TYPE_CLASS_TEXT);
                    myEdittext.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.keyboard_123, 0);

                } else {
                    myEdittext.setRawInputType(InputType.TYPE_CLASS_NUMBER);
                    myEdittext.setInputType(InputType.TYPE_CLASS_NUMBER);
                    myEdittext.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.keyboard_abc, 0);
                }

            }
        });

это результат: при первом отображении EditText выглядит так

введите здесь описание изображения

и нажатие на изображение "ABC" становится таким

введите здесь описание изображения

надеюсь, это может помочь кому-то

person Apperside    schedule 26.07.2013