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
文件中的样板文件仍然存在。)