我正在使用最新的 Android Studio 和 Kotlin 为 Android(API 100% 用户)制作系统键盘。我正在尝试遵循IME 生命周期。
有关于覆盖 onCreateInputView() 的指南
override fun onCreateInputView(): View {
return layoutInflater.inflate(R.layout.input, null).apply {
if (this is MyKeyboardView) {
setOnKeyboardActionListener(this@MyInputMethod)
keyboard = latinKeyboard
}
}
}
其中 MyKeyboardView 是呈现键盘的 KeyboardView 的自定义实现的实例。
问题只是因为android.inputmethodservice.KeyboardView
自 API 级别 29 以来已被弃用。文档说
此类已被弃用,因为这只是一个方便的 UI 小部件类,应用程序开发人员可以在现有公共 API 之上重新实现它。
我不想使用已弃用的功能,但该指南尚未针对此更改进行更新。制作我自己的残酷方法只是在约束布局中制作大量按钮。这是正确的方法吗?作为一个完整的初学者,一旦我无法遵循指南,我就会迷失方向。
很明显,从这里的文档中可以看出:
此类在 API 级别 29 中已弃用。此类已弃用,因为这只是一个方便的 UI 小部件类,应用程序开发人员可以在现有公共 API 之上重新实现。如果您已经依赖该类,请考虑将 AOSP 中的实现复制到您的项目中,或者自己重新实现一个类似的小部件
这意味着您必须使用所有键创建自己的视图,这也意味着处理所有点击事件,如输入、删除和切换键盘,例如。自己去符号等。
其实有很多方法可以做到。但是我会尝试给您一个简单的想法,您将遵循在使用已弃用的 时使用的大部分步骤KeyboardView
:
首先创建您的自定义键盘布局,您可以使用任何布局,具体取决于您喜欢什么LinearLayout
,RelativeLayout
以及Button
s 用于按键等。我使用 aGridLayout
和Button
s。
然后InputMethodService
像往常一样创建子类:
public class MyIMService extends InputMethodService implements View.OnClickListener {
private static String TAG = "MyIMService";
@Override
public View onCreateInputView() {
View myKeyboardView = getLayoutInflater().inflate(R.layout.key_layout, null);
Button btnA = myKeyboardView.findViewById(R.id.btnA);
btnA.setOnClickListener(this);
//ADD ALL THE OTHER LISTENERS HERE FOR ALL THE KEYS
return myKeyboardView;
}
@Override
public void onClick(View v) {
//handle all the keyboard key clicks here
InputConnection ic = getCurrentInputConnection();
if (v instanceof Button) {
String clickedKeyText = ((Button) v).getText().toString();
ic.commitText(clickedKeyText, 1);
}
}
}
正如我之前所说,您可以尝试不同的方式来处理所有的点击事件。但这应该给你基本的想法。
而已。您必须像往常一样在清单文件中添加此服务,其他步骤也像往常一样。这现在应该可以工作了。
更新 Kotlin 版本:
class MyIMService : InputMethodService(), View.OnClickListener {
override fun onCreateInputView(): View {
val myKeyboardView: View = layoutInflater.inflate(R.layout.key_layout, null)
val btnA: Button = myKeyboardView.findViewById(R.id.btnA)
btnA.setOnClickListener(this)
//ADD ALL THE OTHER LISTENERS HERE FOR ALL THE KEYS
return myKeyboardView
}
override fun onClick(v: View) {
//handle all the keyboard key clicks here
val ic = currentInputConnection
if (v is Button) {
val clickedKeyText: String = (v as Button).getText().toString()
ic.commitText(clickedKeyText, 1)
}
}
companion object {
private const val TAG = "MyIMService"
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句