为 android 创建自定义键盘
Creating custom keyboard for android
好吧,您可能已经见过很少像这样问的问题了。
但是阅读所有这些 questions/answers 和 Google 中几乎所有 android 输入法网页,我仍然有麻烦。
我的最终目标是创建自定义键盘。但是当然,我的会有特定语言的特殊输入法。
但这一次,我只想在键盘弹出时显示我的自定义视图。我已经设法弹出基于 qwerty.xml 文件的默认布局,就像这样。
xml/qwerty.xml
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="60dp"
>
<Row android:rowEdgeFlags="bottom">
<Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>
<Key android:codes="44" android:keyLabel="," android:keyWidth="7%p" />
<Key android:codes="47" android:keyLabel="/" android:keyWidth="7%p" />
<Key android:codes="32" android:keyLabel="SPACE" android:keyWidth="30%p" android:isRepeatable="true"/>
<Key android:codes="-5" android:keyLabel="DEL" android:keyWidth="18%p" android:isRepeatable="true"/>
<Key android:codes="-4" android:keyLabel="DONE" android:keyWidth="18%p" android:keyEdgeFlags="right"/>
</Row>
在我扩展 InputMethodService 的 class 中,我有创建输入视图的代码。
private KeyboardView myKeyView;
private Keyboard keyboard;
@Override
public View onCreateInputView() {
myKeyView = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
keyboard = new Keyboard(this, R.xml.qwerty);
myKeyView.setKeyboard(keyboard);
myKeyView.setOnKeyboardActionListener(this);
return myKeyView;
}
当然,因为我在将自定义视图应用到源代码时遇到了问题。
我只是在另一边做了一些努力。当 xml 中的设置键被按下时,
<Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>
它将调用 SettingsActivity
@Override
public void onKey(int primaryCode, int[] keyCodes) {
if(primaryCode == 999) {
openSettings();
}
}
public void openSettings()
{
Intent intent = new Intent(this, WRKeySettings.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
到这里为止它运行良好,但我遇到了这个视图问题。
通过阅读 android 开发人员和一些文章,我的想法是,我可以扩展 KeyboardView 来制作我的自定义视图,并且在这种方法中,我可能能够以某种方式使用 onDraw() 绘制键.但是我在做这件事时遇到了很多麻烦。
任何建议都会很高兴。谢谢。
要自定义键盘,您需要修改 xml 文件夹中的 "qwerty" 和布局文件夹中的键盘。我将展示一些示例:
这在布局文件夹中
<?xml version="1.0" encoding="UTF-8"?>
<com.example.keyboard.MyKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:keyPreviewLayout="@layout/preview"
android:keyBackground="@drawable/key_selector"
android:shadowRadius="0.0"
android:keyTextColor="#000000"
/>
这在 xml 文件夹中:
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:keyHeight="8%p">
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="113" android:keyLabel="q" />
<Key android:codes="119" android:keyLabel="w" />
<Key android:codes="101" android:keyLabel="e" />
<Key android:codes="114" android:keyLabel="r" />
<Key android:codes="116" android:keyLabel="t" />
<Key android:codes="121" android:keyLabel="y" />
<Key android:codes="117" android:keyLabel="u" />
<Key android:codes="105" android:keyLabel="i" />
<Key android:codes="111" android:keyLabel="o" />
<Key android:codes="112" android:keyLabel="p" />
</Row>
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="97" android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="5%p" />
<Key android:codes="115" android:keyLabel="s" />
<Key android:codes="100" android:keyLabel="d" />
<Key android:codes="102" android:keyLabel="f" />
<Key android:codes="103" android:keyLabel="g" />
<Key android:codes="104" android:keyLabel="h" />
<Key android:codes="106" android:keyLabel="j" />
<Key android:codes="107" android:keyLabel="k" />
<Key android:codes="108" android:keyLabel="l" />
</Row>
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="3" android:keyIcon="@drawable/keyboard_shift_off_normal"
android:keyWidth="13.7%p"/>
<Key android:codes="122" android:keyLabel="z" android:horizontalGap="1%p"/>
<Key android:codes="120" android:keyLabel="x" />
<Key android:codes="99" android:keyLabel="c" />
<Key android:codes="118" android:keyLabel="v" />
<Key android:codes="98" android:keyLabel="b" />
<Key android:codes="110" android:keyLabel="n" />
<Key android:codes="109" android:keyLabel="m" />
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete_dim"
android:keyWidth="13.7%p"
android:horizontalGap="1%p"/>
</Row>
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="-16" android:keyIcon="@drawable/keyboard_symbol"
android:keyWidth="18.7%p"/>
<Key android:codes="44" android:keyLabel="," android:horizontalGap="1%p"/>
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_feedback_space" android:keyWidth="40%p"/>
<Key android:codes="46" android:keyLabel="."/>
<Key android:codes="-3" android:keyIcon="@drawable/keyboard_go"
android:keyWidth="18.5%p" android:horizontalGap="1%p"/>
</Row>
</Keyboard>
就像你说的,你可以从键盘布局扩展一个class,但它更适合自定义键盘事件,比如onTouch、onLongKeyPress、
好吧,您可能已经见过很少像这样问的问题了。 但是阅读所有这些 questions/answers 和 Google 中几乎所有 android 输入法网页,我仍然有麻烦。
我的最终目标是创建自定义键盘。但是当然,我的会有特定语言的特殊输入法。
但这一次,我只想在键盘弹出时显示我的自定义视图。我已经设法弹出基于 qwerty.xml 文件的默认布局,就像这样。
xml/qwerty.xml
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="60dp"
>
<Row android:rowEdgeFlags="bottom">
<Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>
<Key android:codes="44" android:keyLabel="," android:keyWidth="7%p" />
<Key android:codes="47" android:keyLabel="/" android:keyWidth="7%p" />
<Key android:codes="32" android:keyLabel="SPACE" android:keyWidth="30%p" android:isRepeatable="true"/>
<Key android:codes="-5" android:keyLabel="DEL" android:keyWidth="18%p" android:isRepeatable="true"/>
<Key android:codes="-4" android:keyLabel="DONE" android:keyWidth="18%p" android:keyEdgeFlags="right"/>
</Row>
在我扩展 InputMethodService 的 class 中,我有创建输入视图的代码。
private KeyboardView myKeyView;
private Keyboard keyboard;
@Override
public View onCreateInputView() {
myKeyView = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
keyboard = new Keyboard(this, R.xml.qwerty);
myKeyView.setKeyboard(keyboard);
myKeyView.setOnKeyboardActionListener(this);
return myKeyView;
}
当然,因为我在将自定义视图应用到源代码时遇到了问题。 我只是在另一边做了一些努力。当 xml 中的设置键被按下时,
<Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>
它将调用 SettingsActivity
@Override
public void onKey(int primaryCode, int[] keyCodes) {
if(primaryCode == 999) {
openSettings();
}
}
public void openSettings()
{
Intent intent = new Intent(this, WRKeySettings.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
到这里为止它运行良好,但我遇到了这个视图问题。
通过阅读 android 开发人员和一些文章,我的想法是,我可以扩展 KeyboardView 来制作我的自定义视图,并且在这种方法中,我可能能够以某种方式使用 onDraw() 绘制键.但是我在做这件事时遇到了很多麻烦。
任何建议都会很高兴。谢谢。
要自定义键盘,您需要修改 xml 文件夹中的 "qwerty" 和布局文件夹中的键盘。我将展示一些示例:
这在布局文件夹中
<?xml version="1.0" encoding="UTF-8"?>
<com.example.keyboard.MyKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:keyPreviewLayout="@layout/preview"
android:keyBackground="@drawable/key_selector"
android:shadowRadius="0.0"
android:keyTextColor="#000000"
/>
这在 xml 文件夹中:
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:keyHeight="8%p">
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="113" android:keyLabel="q" />
<Key android:codes="119" android:keyLabel="w" />
<Key android:codes="101" android:keyLabel="e" />
<Key android:codes="114" android:keyLabel="r" />
<Key android:codes="116" android:keyLabel="t" />
<Key android:codes="121" android:keyLabel="y" />
<Key android:codes="117" android:keyLabel="u" />
<Key android:codes="105" android:keyLabel="i" />
<Key android:codes="111" android:keyLabel="o" />
<Key android:codes="112" android:keyLabel="p" />
</Row>
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="97" android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="5%p" />
<Key android:codes="115" android:keyLabel="s" />
<Key android:codes="100" android:keyLabel="d" />
<Key android:codes="102" android:keyLabel="f" />
<Key android:codes="103" android:keyLabel="g" />
<Key android:codes="104" android:keyLabel="h" />
<Key android:codes="106" android:keyLabel="j" />
<Key android:codes="107" android:keyLabel="k" />
<Key android:codes="108" android:keyLabel="l" />
</Row>
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="3" android:keyIcon="@drawable/keyboard_shift_off_normal"
android:keyWidth="13.7%p"/>
<Key android:codes="122" android:keyLabel="z" android:horizontalGap="1%p"/>
<Key android:codes="120" android:keyLabel="x" />
<Key android:codes="99" android:keyLabel="c" />
<Key android:codes="118" android:keyLabel="v" />
<Key android:codes="98" android:keyLabel="b" />
<Key android:codes="110" android:keyLabel="n" />
<Key android:codes="109" android:keyLabel="m" />
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete_dim"
android:keyWidth="13.7%p"
android:horizontalGap="1%p"/>
</Row>
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
<Key android:codes="-16" android:keyIcon="@drawable/keyboard_symbol"
android:keyWidth="18.7%p"/>
<Key android:codes="44" android:keyLabel="," android:horizontalGap="1%p"/>
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_feedback_space" android:keyWidth="40%p"/>
<Key android:codes="46" android:keyLabel="."/>
<Key android:codes="-3" android:keyIcon="@drawable/keyboard_go"
android:keyWidth="18.5%p" android:horizontalGap="1%p"/>
</Row>
</Keyboard>
就像你说的,你可以从键盘布局扩展一个class,但它更适合自定义键盘事件,比如onTouch、onLongKeyPress、