【问题标题】:Force Android's Softkeyboard in NumberPassword mode without EditText在没有 EditText 的 NumberPassword 模式下强制 Android 软键盘
【发布时间】:2016-05-20 08:38:32
【问题描述】:

有什么方法可以强制在 NumberPassword 模式下显示 Android 的 SoftKeyboard,而我的活动中没有实际的 EditText?

我设法通过在我的 AndroidManifest.xml 上添加 android:windowSoftInputMode="stateAlwaysVisible" 在活动开始时显示键盘,通过在扩展 TextViewCustomView 类中覆盖 onKeyPreIme 并处理触摸来使其无法关闭通过在我的 Activity 中覆盖 onKeyUp 来自行处理事件。

如果我直接在 CustomView 的 XML 布局中添加 android:inputType="numberPassword",则 Activity 的 onKeyUp 会被绕过,键盘会在我的 CustomView 中写入字符,KEYCODE_ENTER 会关闭我的键盘。

我想要实现的是:

  • SoftKeyboard 总是在 Activity Start 和 Resume 从后台退出
  • 无法使用 KEYCODE_ENTER 或 KEYCODE_BACK 关闭
  • 9位布局+退格
  • 自己处理关键压力,让它做其他事情而不是写字符

【问题讨论】:

  • 你能展示一些代码来更好地了解你在做什么吗?
  • stackoverflow.com/questions/13591012/… 非常接近,但没有 EditText。 Numbers / Backspace 将根据按下的键触发不同的方法。该解决方案不起作用,因为至少在我的 6.0.1 Moto X 上,KEYCODE_ENTER 导致键盘消失。

标签: android android-softkeyboard


【解决方案1】:

为方便起见,取自https://developer.android.com/training/keyboard-input/commands.html

ActivityView 类都实现了 KeyEvent.Callback 接口,所以你通常应该重写回调方法 您对这些类的适当扩展。

我建议你在CustomView 类中覆盖onKeyUp 的默认实现,并使CustomView.onKeyUp 方法将事件重定向到ActivityonKeyUp 方法。

举个例子:

public class CustomView extends TextView {
    private KeyEvent.Callback myKeyEventCallback;

    public void setCustomKeyEventCallback(KeyEvent.Callback callback) {
        myKeyEventCallback = callback;
    }

    ...

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        return myKeyEventCallback.onKeyUp(keyCode, event);
    }
}

在你的Activity 中这样做:

CustomView view = ...; // here you take the reference to your custom view
view.setCustomKeyEventCallback(new KeyEvent.Callback() {
    // ... other methods

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        // this calls your activity's implementation of onKeyUp
        MyActivity.this.onKeyUp(keyCode, event);
        return false; // prevent event from firing twice
    }
});

这将帮助您将 onKeyUp 方法调用从您的 CustomView 重定向到您的 Activity 的 onKeyUp 实现。

【讨论】:

  • 有了你的解决方案,我得到了两次触发事件,一次由 CustomView 的 onKeyUp 触发,一次由 Activity 的 onKeyUp 触发。我只是将回调的 onKeyUp 方法设置为始终返回 false,所以我只触发了一次事件。
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 2014-03-22
  • 2017-10-21
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多