多个EditTexts的多个自定义键盘

时间:2014-12-27 00:57:59

标签: java android keyboard android-softkeyboard

我一直关注Maarten Pennings' Android自定义键盘http://www.fampennings.nl/maarten/android/09keyboard/index.htm上的精彩指南,可以成功使用自定义键盘编辑一个或多个EditTexts。我的问题出现在我尝试在一个Activity中使用多个自定义键盘时。以Maarten的十六进制键盘为例,如果使用自定义十六进制键盘而不是edittext0,edittext3和edittext4,如果我希望edittext0使用十六进制键盘,edittext3使用我构建的自定义八进制键盘, edittext4使用自定义十二进制键盘。我在MainActivity.java中尝试了以下内容:

CustomKeyboard mHexKeyboard;
CustomKeyboard mOctKeybaord;
CustomKeyboard mDuoKeybaord;

@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mHexKeyboard= new CustomKeyboard(this, R.id.hexkeyboardview, R.xml.hexkbd );
    mOctKeyboard= new CustomKeyboard(this, R.id.octkeyboardview, R.xml.octkbd );
    mHexKeyboard= new CustomKeyboard(this, R.id.duokeyboardview, R.xml.duokbd );

    mHexKeyboard.registerEditText(R.id.edittext0);
    mOctKeyboard.registerEditText(R.id.edittext3);
    mKeyboard.registerEditText(R.id.edittext4);
}

我得到的错误是:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.username.hexoctduo/com.example.username.hexoctduo.MainActivity}: android.view.InflateException: Binary XML file line #49: Error inflating class android.inputmethodservice.OctKeyboardView

看来我的问题是我正在努力理解XML布局的工作原理。下面是我的尝试,从注释掉的代码中你可以看到我还尝试过的其他内容。

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<EditText android:id="@+id/hex_message"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

<EditText android:id="@+id/oct_message"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

<EditText android:id="@+id/duo_message"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />


<!--
<android.inputmethodservice.KeyboardView
    android:id="@+id/keyboardview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:visibility="gone" />

-->
<android.inputmethodservice.HexKeyboardView
    android:id="@+id/hexkeyboardview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:visibility="gone" />

<android.inputmethodservice.OctKeyboardView
    android:id="@+id/octkeyboardview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:visibility="gone" />

<android.inputmethodservice.DuoKeyboardView
    android:id="@+id/duokeyboardview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:visibility="gone" />

感谢您的反馈!

1 个答案:

答案 0 :(得分:0)

使用类KeyboardView本身不使用三种不同的结构,除非您为此定义了三个类。如果您使用HexKeyboardViewOctKeyboardViewDuoKeyboardView作为服务类型,则必须为每个类定义三个类。而是在调用相同的构造函数来定义CustomKeyboards,如Maarten Penning的示例中所示。只需将以下结构替换为xml即可。我认为这应该可以解决问题。     

        <EditText android:id="@+id/hex_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <EditText android:id="@+id/oct_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <EditText android:id="@+id/duo_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.inputmethodservice.KeyboardView
            android:id="@+id/hexkeyboardview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:visibility="gone" />

        <android.inputmethodservice.KeyboardView
            android:id="@+id/octkeyboardview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:visibility="gone" />

        <android.inputmethodservice.KeyboardView
            android:id="@+id/duokeyboardview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:visibility="gone" />
</LinearLayout>