弃用键盘后,如何为键盘实现自定义视图?

Seu*_*ung 6 custom-keyboard

我正在使用最新的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之上重新实现该类。

我不想使用不推荐使用的功能,但由于该更改,指南尚未更新。制作我自己的残酷方法是在约束布局中创建大量按钮。这是正确的方法吗?作为一个完整的初学者,一旦我无法遵循指南,就会迷路。

Non*_*hoi 3

从这里的文档可以清楚地看出:

此类在 API 级别 29 中已弃用。此类已弃用,因为这只是一个方便的 UI 小部件类,应用程序开发人员可以在现有公共 API 之上重新实现。如果您已经依赖于此类,请考虑将 AOSP 的实现复制到您的项目中或自己重新实现类似的小部件

这意味着您必须使用所有键创建自己的视图,这也意味着处理所有单击事件,例如输入、删除和切换键盘。自己去符号等

实际上有很多方法可以做到。但我会尽力给您一个简单的想法,您将遵循使用已弃用的时使用的大部分步骤KeyboardView

首先创建您的自定义键盘布局,您可以使用任何布局,具体取决于您喜欢的方便LinearLayoutRelativeLayout并且Buttons 代表按键等。我使用了 aGridLayoutButtons。

然后像往常一样创建子类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)