It is clear, from the docs here :
This class was deprecated in API level 29. This class is deprecated
because this is just a convenient UI widget class that application
developers can re-implement on top of existing public APIs. If you
have already depended on this class, consider copying the
implementation from AOSP into your project or re-implementing a
similar widget by yourselves
This means that you have to create your own view with all the keys, which also means handling all the click events like enter, delete and switching keyboards eg. to symbols etc. by yourself.
Actually there are many ways to do it. But I will try to give you a simple idea, you will follow most of the steps that you used while using the deprecated KeyboardView:
First create your custom keyboard layout, you can use any layout depending what is convenient for you like LinearLayout, RelativeLayout and Buttons for the keys etc. I used a GridLayout with Buttons.
Then create the subclass of InputMethodService as usual:
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);
}
}
}
As I said earlier you can try a different way of handling all the click events. But this should give you the basic idea.
That's it. You have to add this service in your manifest file as usual and also the other steps as usual. This should work now.
UPDATE Kotlin version:
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"
}
}