我一直关注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" />
感谢您的反馈!
答案 0 :(得分:0)
使用类KeyboardView
本身不使用三种不同的结构,除非您为此定义了三个类。如果您使用HexKeyboardView
,OctKeyboardView
和DuoKeyboardView
作为服务类型,则必须为每个类定义三个类。而是在调用相同的构造函数来定义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>