【问题标题】:android default keyboard layoutandroid默认键盘布局
【发布时间】:2013-07-25 13:05:36
【问题描述】:

我正在为 nexus 7 开发一个应用程序,我需要某些 EditText 来显示带有数字和特殊字符的键盘视图。我知道您可以使用 inputType 设置 EditText 的布局,但我的问题是如果我设置 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”时显示的布局,这是我需要默认显示的内容

如果我设置 inputType="number" 则显示的布局不允许切换到 lecters 布局

现在我的一些 EditText 普遍是数字,但应该包含数字,我该怎么办?

非常感谢

【问题讨论】:

  • 请记住,如果您能正常工作(我对此表示怀疑),用户可以安装具有完全不同行为的不同键盘。
  • 是的,我知道,但我的目标是确保使用股票键盘的正确行为。你为什么怀疑它是否能正常工作?
  • 如果你让它显示 ?123 下的键,什么是阻止用户切换回来。试试自定义键盘stackoverflow.com/questions/9577304/…
  • 我不需要停止用户切换回来,我需要允许切换,但客户希望默认情况下低于 ?123 的键,因为值是 95% 的时间,但是也可以包含字母
  • 您也许可以使用该特定键码向键盘发送按键。不是最好的解决方案,但它可能会奏效。

标签: android android-softkeyboard android-keypad keyboard-layout


【解决方案1】:

我想我找到了一个非常优雅的解决方案: 我在文本框中使用了一个 Drawable(在我的情况下为 drawableRight),并且我在 drawable 上分配了一个单击侦听器,用于执行数字和文本模式之间的切换。 我可以使用Handling click events on a drawable within an 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 后,我​​在 Activity 中使用了此代码

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”图片变成这样

希望这可以帮助某人

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多