SoftKeyboard 示例的结构实际上与您需要的类似,尽管您不知道。让我们分解一下——这是一个完整的存根,它充当输入法服务并使用标准 XML 键盘:
import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.Keyboard;
public class MyInputMethod extends InputMethodService {
private Keyboard mKeyboard;
@Override public void onInitializeInterface() {
mKeyboard = new Keyboard(this, R.xml.qwerty);
}
@Override public View onCreateInputView() {
mInputView = (KeyboardView) getLayoutInflater().inflate(
R.layout.input, null);
mInputView.setKeyboard(mKeyboard);
return mInputView;
}
}
请注意,有两个 XML 文档被命名。第一个 res/xml/qwerty.xml 定义了布局,以便 KeyboardView 类知道如何绘制键盘。
但它膨胀的布局,res/layout/input.xml,由以下组成(简化):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
<android.inputmethodservice.KeyboardView android:id="@+id/keyboard" />
</LinearLayout>
这就是声明式创建视图所需的全部内容!创建独立的View 与创建Activity 没有太大区别。您没有标准的活动生命周期,但两种环境都允许您访问 XML 布局。您需要做的就是使用充气器,引用您需要的任何子视图,然后返回主视图。
因此,希望您在考虑到这一点后能够扩充您的布局。
如果您的布局足够简单,您甚至不需要使用 XML 布局。如果您的输入法可以完全由单个视图组成,您可以直接在onCreateInputView 中实例化它。这是一个不使用任何 XML 的完整存根输入法服务:
public class MyInputMethod extends InputMethodService {
MyView view;
@Override
public View onCreateInputView() {
return view = new MyView(this);
}
}
(当然清单中的样板文件和res/xml/method.xml 文件仍然存在。)