Hello,
Welcome to our Microsoft Q&A platform!
Yes, you can create a Custom Android Keyboard.
For this, you can refer to the following code:
public class KeyboardOnKeyEventArgs : KeyboardKeyCodeEventArgs
{
public Keycode[] KeyCodes { get; set; }
}
public class KeyboardKeyCodeEventArgs : EventArgs
{
public Keycode PrimaryCode { get; set; }
}
public class KeyboardOnTextEventArgs : EventArgs
{
public ICharSequence Text { get; set; }
}
public class MyKeyboardListener : Java.Lang.Object, KeyboardView.IOnKeyboardActionListener
{
public event EventHandler<KeyboardOnKeyEventArgs> Key;
public event EventHandler<KeyboardKeyCodeEventArgs> Press;
public event EventHandler<KeyboardKeyCodeEventArgs> Release;
public event EventHandler<KeyboardOnTextEventArgs> Text;
public event EventHandler OnSwipeDown;
public event EventHandler OnSwipeLeft;
public event EventHandler OnSwipeRight;
public event EventHandler OnSwipeUp;
public void OnKey(Keycode primaryCode, Keycode[] keyCodes)
{
if (Key != null)
Key(this, new KeyboardOnKeyEventArgs {
KeyCodes = keyCodes,
PrimaryCode = primaryCode
});
}
public void OnPress(Keycode primaryCode)
{
if (Press != null)
Press(this, new KeyboardKeyCodeEventArgs { PrimaryCode = primaryCode });
}
public void OnRelease(Keycode primaryCode)
{
if (Release != null)
Release(this, new KeyboardKeyCodeEventArgs { PrimaryCode = primaryCode });
}
public void OnText(ICharSequence text)
{
if (Text != null)
Text(this, new KeyboardOnTextEventArgs {Text = text});
}
public void SwipeDown()
{
if(OnSwipeDown != null)
OnSwipeDown(this, EventArgs.Empty);
}
public void SwipeLeft()
{
if (OnSwipeLeft != null)
OnSwipeLeft(this, EventArgs.Empty);
}
public void SwipeRight()
{
if (OnSwipeRight != null)
OnSwipeRight(this, EventArgs.Empty);
}
public void SwipeUp()
{
if (OnSwipeUp != null)
OnSwipeUp(this, EventArgs.Empty);
}
}
Usage :
var keyboardListener = new MyKeyboardListener();
keyboardListener.Press += (s, e) => { /* do something */ };
mKeyboardView.OnKeyboardActionListener = keyboardListener;
keyboard.xml
<?xml version="1.0" encoding="utf-8" ?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="33%p" android:horizontalGap="0px"
android:verticalGap="0px" android:keyHeight="54dip">
<Row>
<Key android:codes="8" android:keyLabel="1" android:keyEdgeFlags="left" />
<Key android:codes="9" android:keyLabel="2" />
<Key android:codes="10" android:keyLabel="3" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="11" android:keyLabel="4" android:keyEdgeFlags="left" />
<Key android:codes="12" android:keyLabel="5" />
<Key android:codes="13" android:keyLabel="6" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="14" android:keyLabel="7" android:keyEdgeFlags="left" />
<Key android:codes="15" android:keyLabel="8" />
<Key android:codes="16" android:keyLabel="9" android:keyEdgeFlags="right" />
</Row>
</Keyboard>
Main.axml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_above="@+id/keyboard_view"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:id="@+id/target"
android:layout_height="wrap_content" />
<android.inputmethodservice.KeyboardView
android:id="@+id/keyboard_view"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
</RelativeLayout>
slide_up.xml
<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="-50%p" android:toYDelta="0" android:duration="200"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="200" />
</set>
MyKeyboardListener.cs
public class MyKeyboardListener : Java.Lang.Object, KeyboardView.IOnKeyboardActionListener
{
private readonly Activity _activity;
public MyKeyboardListener(Activity activity) {
_activity = activity;
}
public void OnKey(Keycode primaryCode, Keycode[] keyCodes)
{
var eventTime = DateTime.Now.Ticks;
var keyEvent = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, primaryCode, 0);
_activity.DispatchKeyEvent(keyEvent);
}
public void OnPress(Keycode primaryCode) { }
public void OnRelease(Keycode primaryCode) { }
public void OnText(ICharSequence text) { }
public void SwipeDown() { }
public void SwipeLeft() { }
public void SwipeRight() { }
public void SwipeUp() { }
}
MainActivity.cs
[Activity(Label = "App14", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
private Keyboard _keyBoard;
private EditText _targetView;
private KeyboardView _keyboardView;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
_keyBoard = new Keyboard(this, Resource.Xml.keyboard);
_keyboardView = FindViewById<KeyboardView>(Resource.Id.keyboard_view);
_keyboardView.Keyboard = _keyBoard;
_keyboardView.OnKeyboardActionListener = new MyKeyboardListener(this);
_targetView = FindViewById<EditText>(Resource.Id.target);
_targetView.Touch += (sender, args) => {
var bottomUp = AnimationUtils.LoadAnimation(this, Resource.Animation.slide_up);
_keyboardView.StartAnimation(bottomUp);
_keyboardView.Visibility = ViewStates.Visible;
args.Handled = true;
};
}
}
Refer: https://stackoverflow.com/questions/31266845/xamarin-custom-keyboard
Update
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
Just as document KeyboardView adviced, the only solution Google suggests is to copy KeyboardView.java and Keyboard.java files to our local project from Android AOSP.
You will also have your local copy of com.android.internal.R attributes (stylable)
from from here .
You can notice, it is annotated as
<!-- {@deprecated Copy this definition into your own application project.} -->
And there is a similar thread here, you can check it here: https://stackoverflow.com/questions/60316785/keyboardview-is-deprecated-in-android
Hope it can help you.
Best Regards,
Jessie Zhang
---
If the response is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.