gpt4 book ai didi

android - 默认情况下如何以符号模式显示Android键盘?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:28 41 4
gpt4 key购买 nike

我有一个 EditText组件,当然,如果您单击它,则会显示 Android 键盘,允许用户输入文本。据我所知,所有 Android 软件键盘(至少)都有字母模式( ABC )和符号模式( ?123 )。他们的默认 View 是字母模式。

现在当键盘显示时 EditText单击组件,我希望默认显示符号模式。用户仍然可以切换到字母模式。

enter image description here

有没有办法实现这一目标?如果是,如何?

最佳答案

我发布这个是因为我认为任何答案都没有真正解决这个问题。问题中的屏幕截图与特定 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似乎是一个不错的候选人。
在 xml 中,您的布局将如下所示:
<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 .
问题 :
如您所知,这并不是真正的解决方案。如果用户在 TEXT 模式下关闭键盘(使用 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 上测试,这似乎有效。将需要更多的测试。
我真的希望有人能想出比这更好、更强大的解决方案 - 或者修改我的解决方法,使其看起来不像。
摘要
手头的任务是提供围绕现有输入法引擎 (IME) 在 NUMBER 和 TEXT 输入模式之间切换的功能。第一种方法是使用 imeActionLabel & imeActionId 在切换机制中。这种方法适用于 Google 的键盘 ( this is the imeActionLabel ),但不适用于三星的 - imeActionLabel failed to show up in portrait (没有 extract )。可能的解决方法是在应用程序自己的 UI 中包含切换按钮。
即使使用 Google 的键盘,输入字母后模式切换回 NUMBER 时,字母(文本)也无法显示。此问题已通过使用标志 flagNoExtractUi 修复(至少在经过测试的设备上)这可以防止 IME 以横向方式进入全屏模式。
最终解决方案 (待实现和测试)
  • IME 以数字输入模式启动(95% 的用例涉及数字输入)
  • 一个按钮被添加到应用程序的 UI(在 EditText 旁边)用于在 NUMBER 和 TEXT 模式之间切换
  • 用户可以不受任何限制地从 NUMBER 切换到 TEXT。从 TEXT 切换回 NUMBER 要求未添加任何字母。
  • InputType 在键盘关闭和重新打开之间保留。示例:如果用户切换到 TEXT 模式并关闭键盘,它将以 TEXT 模式打开。 InputType 不会重置。

  • 有关尝试的方法的更多信息,请参阅 this discussion thread .
    截图
    默认 (NUMBER) :
    enter image description here
    切换到文本 :
    enter image description here
    Recorded video link

    关于android - 默认情况下如何以符号模式显示Android键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25219855/

    41 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com