我正在使用最新的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
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中MyKeyboardView是呈现键盘的KeyboardView的自定义实现的实例。
该问题仅是因为android.inputmethodservice.KeyboardView自API级别29起已弃用。
不推荐使用此类,因为这只是一个方便的UI小部件类,应用程序开发人员可以在现有的公共API之上重新实现该类。
我不想使用不推荐使用的功能,但由于该更改,指南尚未更新。制作我自己的残酷方法是在约束布局中创建大量按钮。这是正确的方法吗?作为一个完整的初学者,一旦我无法遵循指南,就会迷路。
从这里的文档可以清楚地看出:
此类在 API 级别 29 中已弃用。此类已弃用,因为这只是一个方便的 UI 小部件类,应用程序开发人员可以在现有公共 API 之上重新实现。如果您已经依赖于此类,请考虑将 AOSP 的实现复制到您的项目中或自己重新实现类似的小部件
这意味着您必须使用所有键创建自己的视图,这也意味着处理所有单击事件,例如输入、删除和切换键盘。自己去符号等。
实际上有很多方法可以做到。但我会尽力给您一个简单的想法,您将遵循使用已弃用的时使用的大部分步骤KeyboardView:
首先创建您的自定义键盘布局,您可以使用任何布局,具体取决于您喜欢的方便LinearLayout,RelativeLayout并且Buttons 代表按键等。我使用了 aGridLayout和Buttons。
然后像往常一样创建子类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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如我之前所说,您可以尝试使用不同的方式来处理所有单击事件。但这应该给你基本的想法。
就是这样。您必须像往常一样在清单文件中添加此服务,并且其他步骤也像往常一样。现在应该可以了。
更新 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"
}
}
Run Code Online (Sandbox Code Playgroud)