我有自定义项的ListActivity,其中每个项都有自己的TextEdit.点击它们中的任何一个都会使IME键盘上升并导致ListView的大小调整.因此,最近通过tap获得焦点的EditText失去了它.需要第二次点击才能使其专注或确定.只有当我移动列表中的1个项目时才会发生这种情况.
有没有办法打开IME并只关注一下点击EditText?
我知道有一个针对 InputMethodKit 框架的 API 参考。还有Objective-C 的示例代码,但没有提供 Swift 的示例。
有谁知道如何用 Swift 制作一个简单的 IME?它可以具有重复该字母但不执行任何操作等功能,因此我可以知道它确实有效。您使用哪些 Xcode SDK 构建并成功运行它?
我已经成功实现了自定义键盘。它正在按预期方式工作。我要imageButton
在键盘顶部添加一个,如下图所示,以便每当键盘弹出时它始终显示在键盘上方。谁能指导我如何将此图像按钮添加到自定义键盘?
如果有人愿意,以下是键盘代码。
Keyboard.xml键盘的布局
<android.inputmethodservice.KeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:keyPreviewLayout ="@layout/preview"
/>
Run Code Online (Sandbox Code Playgroud)
这keyPreviewLayout
是短暂弹出窗口的布局,每当按下键盘上的某个键时,该布局就会显示出来。
qwerty.xml
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="60dp"
>
<Row>
<Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
<Key android:codes="50" android:keyLabel="2"/>
<Key android:codes="51" android:keyLabel="3"/>
<Key android:codes="52" android:keyLabel="4"/>
<Key android:codes="53" android:keyLabel="5"/>
<Key android:codes="54" android:keyLabel="6"/>
<Key android:codes="55" android:keyLabel="7"/>
<Key android:codes="56" android:keyLabel="8"/>
<Key android:codes="57" android:keyLabel="9"/>
<Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
</Row>
<Row>
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
<Key android:codes="119" android:keyLabel="w"/>
<Key android:codes="101" android:keyLabel="e"/>
<!--And so on for all the keys-->
Run Code Online (Sandbox Code Playgroud)
SimpleIME.java这是键盘的服务类 …
我正在制作一个带有自定义图像的键盘,我必须在点击时"复制到剪贴板".我已经按照本教程制作了一个有效的键盘.按下一个键我也可以改变键盘布局.现在我想更改键盘的每个键的背景和字体,我也想在gridview中添加给定的图像.我搜索了一些东西,却找不到完美的东西.
教程的任何链接也将表示赞赏.
提前致谢.
我希望能够支持自定义 Windows 控件中的文本输入,就像 EDIT 和 Rich Edit 控件已经做的那样,但不对其中任何一个控件进行子类化。该控件当前使用 Direct2D 和 DirectWrite 绘制文本,并在带有平台更新的 Windows Vista SP1 或更高版本上运行(如果我决定需要更新的 Direct2D 和 DirectWrite 功能,我可能会将其更改为带有平台更新的 Windows 7 SP1 或更高版本,假设这些功能是在那里可用或仅在 Windows 8 上可用,但这是一个不同的问题......)
就其价值而言,在 OS XI 上我会使用NSTextInputClient,在 GTK+ 上我会使用GtkIMContext。我正在谈论的就是这样的事情。
显而易见的选择是使用WM_CHAR
,如果我正确收集的话,如果窗口类是用 注册的RegisterClassW()
,那么它本身就是 UTF-16 ,因此无论位置如何都应该“正常工作”。然而,WM_CHAR
是由 生成的TranslateMessage()
,并且它的文档说没有办法确定 a 是否WM_CHAR
已生成,因为TranslateMessage()
总是返回非零。我需要能够确定当前的键盘消息是否将由文本系统处理(因此应该被忽略);这尤其正确,因为所有非文本键都需要以独立于布局的方式处理(我已经有了)。
我还在 Windows 7 示例代码中看到了 IMM API 和文本服务框架。我不确定一个是否比另一个更好,而且他们似乎都做同样的事情。他们吗?
就 IMM 而言,有许多WM_IMM_xxx
消息我不确定是否应该忽略,并且我发现的每个参考文献似乎都不同意我是否应该在 Unicode 窗口中处理它们。 ..此外,上述了解 IMM 是否会处理给定按键事件的问题仍然悬而未决;有办法吗?
TSF 有一个称为 ACP 的概念,它似乎允许我使用我想要的任何文本存储格式来存储我实际要使用的文本(即,不是正在进行的合成)。这是真的?我希望能够将文本存储为带有属性的 UTF-8,在绘图时转换为 …
这是《在 Windows 上处理自定义控件中的任意文本输入的正确、现代方法是什么?》的延续。WM_CHAR?注塑机?TSF?。
\n\n因此,在尝试了非 IME 布局(美国英语)、非 TSF IME(Windows XP DDK 中的日语 FAKEIME)和 TSF 文本服务(Windows 7 附带的任何内容)后,看来如果活动输入处理器配置文件不是 TSF 文本服务(即,它是TF_PROFILETYPE_KEYBOARDLAYOUT
),我仍然需要处理击键和WM_CHAR
消息来进行文本输入。
我的问题是我的架构需要一种方式来告知它可以忽略当前的关键消息,因为它已转换为文本输入消息。它不关心这是发生在翻译之前还是之后;它只需要知道这样的翻译将会或已经发生。或者用伪代码术语来说:
\n\n// if I can suppress WM_CHAR generation and synthesize it myself (including if the translation is just dead keys)\ncase WM_KEYDOWN:\ncase WM_SYSKEYDOWN:\n if (WillTranslateMessage())\n InsertChar(GenerateEquivalentChar());\n else\n HandleRawKeyEvent();\n break;\n\n// if I can know if a WM_CHAR was generated (or will be generated; for instance, in the case of dead keys)\ncase WM_KEYDOWN:\ncase …
Run Code Online (Sandbox Code Playgroud) 我在Windows 10 Creators更新中遇到一个问题,当我尝试使用IME向应用程序中输入内容时,第一个字符将被忽略。即,如果我使用IME输入日语平假名字符“?” 通过输入K&A,我最终只会得到'?' 随着K的丢失。这仅发生在第一个字符上。但是完全相同的应用程序可以在Windows 7〜8中正常工作。
详细信息如下:
该应用程序是容器/服务器类型的MFC MDI应用程序。它的工作非常简单明了。如果打开了文档,则在触发WM_KEYDOWN时,动态创建一个CEdit框并将按下的键输入到编辑框中。如果编辑框已经存在,则无需再次创建它。只需将输入追加到编辑框的内容即可。
我创建了2个示例MFC MDI项目(例如MDI_sample1&MDI_Sample2)。保持默认的cpp&h文件不变,只需向MDI_Sample1和MDI_Sample2项目添加一个新类(例如CwEdit),该类将CEdit类子类化。现在,在MDI_Sample1中,打开* View.cpp,并添加WindowProc覆盖。在此函数中,我检查WM_KEYDOWN消息,并在WM_KEYDOWN上(除了VK_BACK,VK_ENTER,VK_TAB之外),使用CwEdit类动态创建一个编辑框,然后使用我获得的当前wParam和lParam向SendMessage发送一个WM_KEYDOWN。 WindowProc函数。运行程序,创建一个文档,然后按“ k”键。在文档中将创建一个编辑框。如果未使用IME,则还将在此新创建的编辑框中输入字符“ k”。接下来,我按“ a” 并且在编辑框中将字符“ a”附加到“ k”之后。到目前为止,一切都很好。
接下来,我再次创建一个新文档。这次,我将Windows IME激活为日语,然后输入“ k”。再次,将创建一个编辑框,它将显示带有波浪下划线的“ k”。我输入了“ a”,它正确显示了日语字符“?”。再次,期望和正确。
我将此exe文件复制到Windows 10 1709计算机上并运行它。同样,我重复上述相同的步骤来输入字符“ k”。在未激活IME的情况下,将创建该框并在其中输入“ k”。接下来,我按“ a”,编辑框将正确读取“ ka”。接下来,我创建一个新文档。这次,我将Windows IME激活为日语,然后输入“ k”。同样,将创建一个编辑框,但它为空。我输入了“ a”,它现在显示日语字符“?”。此行为发生在所有字符上。当IME处于活动状态时,将不会显示用于创建编辑框的第一个按键。但是,一旦创建了编辑框,一切都会正常。
我将整个代码复制到MDI_Sample2。但是有一点变化。这次,在视图中,我将覆盖PreTranslateMessage并执行与以前在WindowProc中完成的过程完全相同的过程。并删除WindowProc替代。即使日语IME处于活动状态,此MDI_Sample2在Windows 7以及Windows 10 1709上都可以很好地运行。
这两个项目的* View.cpp代码如下所示:
MDI_Sample1View.cpp
BOOL MDI_Sample1View::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message == WM_CHAR)
{
int wp = static_cast<int>(wParam);
// All printable ascii characters
if (wp >= 0x32 && wp …
Run Code Online (Sandbox Code Playgroud) 我想创建一个不允许输入任何字符的文本输入(与禁用输入相同,但鼠标光标仍然显示)
function loadPage() {
const el = document.getElementById('input-id');
el.addEventListener('keydown', (event) => {
event.preventDefault();
});
}
loadPage();
Run Code Online (Sandbox Code Playgroud)
<input maxlength="0" id="input-id">
Run Code Online (Sandbox Code Playgroud)
上面的代码适用于普通字母字符。但是,当我使用IME输入日语全角字符时,它不起作用(仍然可以输入字符)
您知道问题出在哪里吗?有什么解决办法吗?
我有一个带有文本字段的固定底部容器。我使用 imePadding 修饰符。当键盘出现时,imePadding 似乎会工作两次。它仅发生在某些设备上。特别是我的是三星 Galaxy A80 (Android 11)
代码示例
Scaffold(
modifier = Modifier.fillMaxSize(),
bottomBar = {
Box(
Modifier
.imePadding()
.height(100.dp)
.background(Color.Red),
) {
BasicTextField(
modifier = Modifier.fillMaxWidth(),
value = "some text",
onValueChange = {},
)
}
},
) {
Box(
Modifier.fillMaxSize().padding(bottom = it.calculateBottomPadding()),
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
) {
repeat((0..100).count()) {
item {
Box(Modifier.fillMaxWidth().height(100.dp).background(Color.Blue)) {
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我添加以下内容时, UPD问题会重现:
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
Run Code Online (Sandbox Code Playgroud)