- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 EditText
组件,当然,如果您单击它,则会显示 Android 键盘,允许用户输入文本。据我所知,所有 Android 软件键盘(至少)都有字母模式( ABC
)和符号模式( ?123
)。他们的默认 View 是字母模式。
现在当键盘显示时 EditText
单击组件,我希望默认显示符号模式。用户仍然可以切换到字母模式。
有没有办法实现这一目标?如果是,如何?
最佳答案
我发布这个是因为我认为任何答案都没有真正解决这个问题。问题中的屏幕截图与特定 InputType 的默认状态不对应。因此,切换 InputTypes 不会为您提供屏幕截图中的布局。
(根据我的研究...)
对符号输入的支持不受任何合约的约束。在创建自己的符号时,可以很好地忽略符号 InputMethod
.或者,他们可以添加分页支持以提供对数百个符号的访问。这可以受契约(Contract)约束吗?也许。但是,目前不是。
输入法框架不允许客户端和 IME 之间的直接通信。所有通信都通过 InputMethodManager
进行。或通过 InputConnection
— 单向 channel 。使用 ?123
切换到符号然而,是一个内部事件——不是一个定义的状态/ Action 。客户端应用程序无法切换到它。没有公共(public)(或隐藏)API 来实现这一点。InputType
表示与 IME 完全不同的东西。不知道为什么每个人都推荐使用它。 您当然可能会发现某个特定的 InputType
提供大部分所需的 key .但这与 show[ing] Android keyboard with symbols mode by default.
不一样
可能的解决方法 :
我们将创建一个自定义 EditText
.我们不必。它只会把所有东西都放在一个地方,让我们免于复制粘贴的噩梦。
public class CusEditText extends EditText {
private final int mDefinedActionId;
public CusEditText(Context context, AttributeSet attrs) {
super(context, attrs);
// Corresponds to 'android:imeActionId' value
mDefinedActionId = getResources().getInteger(R.integer.definedActionId);
setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Log.i("CusEditText", "onEditorAction, actionId = " + actionId);
// Only bother if (...)
if (actionId == mDefinedActionId) {
// Check if current InputType is NUMBER
if ((getInputType() & InputType.TYPE_CLASS_NUMBER) != 0) {
// Toggle
setImeActionLabel("NUM", mDefinedActionId);
setInputType(InputType.TYPE_CLASS_TEXT);
} else {
// Current InputType is TEXT // Toggle
setImeActionLabel("ABC", mDefinedActionId);
setInputType(InputType.TYPE_CLASS_NUMBER);
}
// We've handled this
return true;
}
// Let someone else worry about this
return false;
}
});
}
}
接下来,我们需要定义
definedActionId
.打开或创建
res/values/integers.xml
并添加:
<integer name="definedActionId">-100</integer>
-100
是一个任意值。我查了
EditorInfo
并且 actionIds (
IME_ACTION_XXXX
) >= 0。
-100
似乎是一个不错的候选人。
<com.your.packagename.CusEditText
android:layout_width="blah"
android:layout_height="blah"
android:inputType="number"
android:imeActionId="@integer/definedActionId"
android:imeActionLabel="ABC"/>
<!-- Probably use @string resource in place of ABC -->
没有太多要解释的。 IME 将在 NUMBER 模式下启动。它将显示
ABC
而不是复选标记图标.单击时,我们拦截 actionId 并在 NUMBER 和 TEXT 输入之间切换。我们正在使用
setInputType(...)
因为它不仅更新了
InputType
,它还会通过更改重新启动 IME。
setRawInputType(...)
只更新
InputType
.
back
按钮),当他们再次打开键盘时,键盘将保持在 TEXT 模式。要进入 NUMBER 模式,用户必须点击
NUM
.此外,在文本模式下,用户将看到
NUM
作为行动,随着
?123
选项。这不会破坏任何东西,但会影响用户体验。
?123
由于上面列出的原因以文本模式显示。但是,我们可以尝试确保键盘始终以 NUMBER 模式打开。我将提供一个粗略的草图,说明我们将如何做到这一点。它不是直截了当的,因为我们(开发人员)不知道键盘关闭或打开等事件。更新
CusEditText
:
public class CusEditText extends EditText {
private final int mDefinedActionId;
private long mLastEditorActionTime = 0L;
public CusEditText(Context context, AttributeSet attrs) {
super(context, attrs);
// Corresponds to 'android:imeActionId' value
mDefinedActionId = getResources().getInteger(R.integer.definedActionId);
setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Log.i("CusEditText", "onEditorAction, actionId = " + actionId);
// Only bother if (...)
if (actionId == mDefinedActionId) {
// setInputType(...) will restart the IME
// and call finishComposingText()
// see below
mLastEditorActionTime = SystemClock.elapsedRealtime();
// Check if current InputType is NUMBER
if ((getInputType() & InputType.TYPE_CLASS_NUMBER) != 0) {
// Toggle
setImeActionLabel("NUM", mDefinedActionId);
setInputType(InputType.TYPE_CLASS_TEXT);
} else {
// Current InputType is TEXT // Toggle
setImeActionLabel("ABC", mDefinedActionId);
setInputType(InputType.TYPE_CLASS_NUMBER);
}
// We've handled this
return true;
}
// Let someone else worry about this
return false;
}
});
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
return new CusInputConnectionWrapper(inputConnection, false);
}
private class CusInputConnectionWrapper extends InputConnectionWrapper {
private CusInputConnectionWrapper(InputConnection target, boolean mutable) {
super(target, mutable);
}
@Override
public boolean finishComposingText() {
Log.i("CICW", "finishComposingText");
// Ignore finishComposingText for 1 second (1000L)
if (SystemClock.elapsedRealtime() - mLastEditorActionTime > 1000L) {
if ((getInputType() & InputType.TYPE_CLASS_NUMBER) == 0) {
// InputConnection is no longer valid.
// Switch back to NUMBER iff required
setImeActionLabel("ABC", mDefinedActionId);
setInputType(InputType.TYPE_CLASS_NUMBER);
}
}
return super.finishComposingText();
}
}
}
同样,代码是不言自明的。我们创建了一个
InputConnectionWrapper
并聆听
finishComposingText()
回调。如果我们在
TEXT
之间手动切换和
NUMBER
,我们使用一个标志,因为
finishComposingText()
会自动调用。否则,我们检查输入类型是否设置为
TEXT
并将其更改为
NUMBER
.我不确定是否
finishComposingText()
是解释键盘关闭/打开的正确方法。在 API 21、vanilla android 上测试,这似乎有效。将需要更多的测试。
imeActionLabel & imeActionId
在切换机制中。这种方法适用于 Google 的键盘 (
this is the imeActionLabel ),但不适用于三星的 -
imeActionLabel
failed to show up in portrait (没有
extract )。可能的解决方法是在应用程序自己的 UI 中包含切换按钮。
flagNoExtractUi
修复(至少在经过测试的设备上)这可以防止 IME 以横向方式进入全屏模式。
EditText
旁边)用于在 NUMBER 和 TEXT 模式之间切换 关于android - 默认情况下如何以符号模式显示Android键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25219855/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!