为android创建自定义键盘

问题描述:

好吧,您可能会看到像询问这样的问题。 但是,阅读所有这些问题/答案以及Google中几乎所有的android inputmethod网页,我仍然遇到麻烦。为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,我有这个代码它创建输入图。

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 develpers和一些文章是,我可以扩展KeyboardView使我的自定义视图,并在此方法中,我可能能够用onDraw()以某种方式绘制键。但是我这么做很麻烦。

任何建议都会很高兴。谢谢。

+0

为了清楚地理解问题,您希望以编程方式创建另一个布局?你想改变现有的吗?你想在不同的应用程序上重复使用相同的“键盘”吗?你可以“重新绘制”按键,但是它们可以具有相同的功能,或者可以将视图添加到布局中,并“重做”窗口以及...尝试尽可能详细地描述你想要完成的任务 – Bonatti

要定制键盘,您需要在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> 

就像你说的,可以延长从键盘类布局,但更多的是自定义键盘事件,如onTouch,onLongKeyPress,

+0

不幸的是,这不是我想要的具体答案。我会试着找到一种方法来让这件事情起作用,并写出一个具体的指导,因为目前没有这方面的内容。 – luopleming