在 android TabLayout 中显示虚拟键盘
Display virtual keyboard in android TabLayout
我正在使用 TabLayout 来显示不同的输入法。第一个选项卡包含按钮,第四个选项卡应显示嵌入此 TabLayout 中的标准键盘。这是它应该是什么样子的截图:
TabLayout 到目前为止有效。我尝试使用 KeyboardView 创建布局 XML 文件。但是应用程序没有显示键盘:
<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
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"
/>
如果我使用的是简单的 Textview,应用程序会显示文本...因此 TabLayout 本身可以正常工作:
<?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"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="This is a tab layout"
android:id="@+id/textView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
我的问题是如何创建一个简单的键盘并将其显示在 TabLayout 中?谢谢!
大约两年前我写了一个输入法。你的情况和我的不一样,但是思路应该是一样的。
问题是您没有为键盘视图指定键盘布局。
见代码:
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Round up a little
if (mKeyboard == null) {
setMeasuredDimension(mPaddingLeft + mPaddingRight, mPaddingTop + mPaddingBottom);
} else {
int width = mKeyboard.getMinWidth() + mPaddingLeft + mPaddingRight;
if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) {
width = MeasureSpec.getSize(widthMeasureSpec);
}
setMeasuredDimension(width, mKeyboard.getHeight() + mPaddingTop + mPaddingBottom);
}
}
mKeyboard
变量 cat 通过 setKeyboard
设置。你应该做的是:
- 在资源文件夹中创建键盘布局文件
- 创建一个
Keyboard
实例并将其设置为 KeyboardView
- 尝试 运行 代码。
我没有写任何其他信息,所以我认为根据文档编写使用键盘的完整步骤是有意义的,或者,This Example:
1 通过添加属性(到 activity 或服务)更改清单
<service android:name=".SimpleIME"
android:label="@string/simple_ime"
android:permission="android.permission.BIND_INPUT_METHOD"
>
<meta-data android:name="android.view.im" android:resource="@xml/method"/>
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
</service>
2) 使用键盘属性创建主文件:
<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android">
<subtype
android:label="@string/subtype_en_US"
android:imeSubtypeLocale="en_US"
android:imeSubtypeMode="keyboard" />
</input-method>
3) 在布局中定义 KeyboardView(就像您所做的那样)
<?xml version="1.0" encoding="UTF-8"?>
<android.inputmethodservice.KeyboardView
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"
/>
4) 定义键盘按键(仅举个例子):
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="60dp" >
<Row>
<Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
<Key android:codes="50" android:keyLabel="2"/>
<Key android:codes="51" android:keyLabel="3"/>
<Key android:codes="52" android:keyLabel="4"/>
// ..........
</Keyboard>
5) 在Acitivity中定义服务或扩展此接口:
public class SimpleIME extends InputMethodService
implements OnKeyboardActionListener{
private KeyboardView kv;
private Keyboard keyboard;
private boolean caps = false;
@Override
public void onKey(int primaryCode, int[] keyCodes) {
}
@Override
public void onPress(int primaryCode) {
}
@Override
public void onRelease(int primaryCode) {
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeDown() {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeUp() {
}
}
6) 不仅仅是根据示例或文档更新操作方法。
仅此而已...
在我的片段中我需要一些代码行,例如我必须添加一个布局 XML:
public class SQLConsoleTab2Fragment extends SQLConsoleFragment implements KeyboardView.OnKeyboardActionListener {
public KeyboardView keyboard123;
public View Tab2View;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//execute(v)
Tab2View = inflater.inflate(R.layout.tab2, container, false);
keyboard123 = (KeyboardView) Tab2View.findViewById(R.id.keyboard123);
Keyboard k1 = new Keyboard(Tab2View.getContext(), R.xml.qwerty_keyboard);
Tab2View.findViewById(R.id.keyboard123);
keyboard123.setKeyboard(k1);
keyboard123.setEnabled(true);
keyboard123.setPreviewEnabled(true);
keyboard123.setOnKeyboardActionListener(this);
return Tab2View;
}
}
我正在使用 TabLayout 来显示不同的输入法。第一个选项卡包含按钮,第四个选项卡应显示嵌入此 TabLayout 中的标准键盘。这是它应该是什么样子的截图:
TabLayout 到目前为止有效。我尝试使用 KeyboardView 创建布局 XML 文件。但是应用程序没有显示键盘:
<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
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"
/>
如果我使用的是简单的 Textview,应用程序会显示文本...因此 TabLayout 本身可以正常工作:
<?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"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="This is a tab layout"
android:id="@+id/textView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
我的问题是如何创建一个简单的键盘并将其显示在 TabLayout 中?谢谢!
大约两年前我写了一个输入法。你的情况和我的不一样,但是思路应该是一样的。
问题是您没有为键盘视图指定键盘布局。
见代码:
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Round up a little
if (mKeyboard == null) {
setMeasuredDimension(mPaddingLeft + mPaddingRight, mPaddingTop + mPaddingBottom);
} else {
int width = mKeyboard.getMinWidth() + mPaddingLeft + mPaddingRight;
if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) {
width = MeasureSpec.getSize(widthMeasureSpec);
}
setMeasuredDimension(width, mKeyboard.getHeight() + mPaddingTop + mPaddingBottom);
}
}
mKeyboard
变量 cat 通过 setKeyboard
设置。你应该做的是:
- 在资源文件夹中创建键盘布局文件
- 创建一个
Keyboard
实例并将其设置为KeyboardView
- 尝试 运行 代码。
我没有写任何其他信息,所以我认为根据文档编写使用键盘的完整步骤是有意义的,或者,This Example:
1 通过添加属性(到 activity 或服务)更改清单
<service android:name=".SimpleIME"
android:label="@string/simple_ime"
android:permission="android.permission.BIND_INPUT_METHOD"
>
<meta-data android:name="android.view.im" android:resource="@xml/method"/>
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
</service>
2) 使用键盘属性创建主文件:
<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android">
<subtype
android:label="@string/subtype_en_US"
android:imeSubtypeLocale="en_US"
android:imeSubtypeMode="keyboard" />
</input-method>
3) 在布局中定义 KeyboardView(就像您所做的那样)
<?xml version="1.0" encoding="UTF-8"?>
<android.inputmethodservice.KeyboardView
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"
/>
4) 定义键盘按键(仅举个例子):
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="60dp" >
<Row>
<Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
<Key android:codes="50" android:keyLabel="2"/>
<Key android:codes="51" android:keyLabel="3"/>
<Key android:codes="52" android:keyLabel="4"/>
// ..........
</Keyboard>
5) 在Acitivity中定义服务或扩展此接口:
public class SimpleIME extends InputMethodService
implements OnKeyboardActionListener{
private KeyboardView kv;
private Keyboard keyboard;
private boolean caps = false;
@Override
public void onKey(int primaryCode, int[] keyCodes) {
}
@Override
public void onPress(int primaryCode) {
}
@Override
public void onRelease(int primaryCode) {
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeDown() {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeUp() {
}
}
6) 不仅仅是根据示例或文档更新操作方法。 仅此而已...
在我的片段中我需要一些代码行,例如我必须添加一个布局 XML:
public class SQLConsoleTab2Fragment extends SQLConsoleFragment implements KeyboardView.OnKeyboardActionListener {
public KeyboardView keyboard123;
public View Tab2View;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//execute(v)
Tab2View = inflater.inflate(R.layout.tab2, container, false);
keyboard123 = (KeyboardView) Tab2View.findViewById(R.id.keyboard123);
Keyboard k1 = new Keyboard(Tab2View.getContext(), R.xml.qwerty_keyboard);
Tab2View.findViewById(R.id.keyboard123);
keyboard123.setKeyboard(k1);
keyboard123.setEnabled(true);
keyboard123.setPreviewEnabled(true);
keyboard123.setOnKeyboardActionListener(this);
return Tab2View;
}
}