我正在尝试EditText
,并且当用户点按EditText
时,可以在屏幕底部显示键盘。我知道InputMethodService
和SoftKeyboard示例,但我不能以这种方式使用它,因为我的键盘只能用于此EditText
。
此外,应该有一个上下文菜单,但这不是这个问题的一部分(我认为)。
我已经阅读了大量代码片段,但在很多情况下它们包含的方法不再可用(即getViewInflate()
)或者是在我不理解或不能理解的上下文中编写的翻译成我的代码(请注意,我是Android的新手)。
在大多数尝试中,当我点按EditText
:
java.lang.IllegalArgumentException: width and height must be > 0
后跟一个不包含任何类的堆栈跟踪。正如您在下面的代码中看到的,所有尺寸都已设置。
下面你看到的是代码的当前状态(我删除了一些代码,我希望它仍然有意义)。我还试图在主线程中使用handler.post()
内部的内容,使用注释的内容而不是handler.post()
...
以下内容不是尝试在一个布局XML中使用RelativeLayout
EditText
和KeyboardView
。有一个不同的例外,例如“无效类型0x12”或创建布局时的东西。
它只是不起作用或我只是不知道该怎么做。有人可以指导我完成这个吗?如果遗漏了什么,请告诉我。
main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:id="@+id/field_input"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:inputType="textMultiLine|textImeMultiLine"
android:typeface="monospace"
android:gravity="top|left"
android:maxLength="255"
/>
</LinearLayout>
keyboard.xml:
<?xml version="1.0" encoding="utf-8"?>
<com.messenger.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_alignParentBottom="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
LatinKeyboardView.java:
import android.inputmethodservice.KeyboardView;
public class LatinKeyboardView extends KeyboardView {
:
}
EditorActivity.java
import android.app.Activity;
public class EditorActivity extends Activity {
private View keyboardLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
final EditText inputField;
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
keyboardLayout = (View)getLayoutInflater().inflate(R.layout.keyboard, null, false);
inputField = (EditText)findViewById(R.id.field_input);
registerForContextMenu(inputField);
inputField.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.input, null, false), 100, 100, true);
PopupWindow pw = new PopupWindow(keyboardLayout, 100, 100, true);
pw.showAtLocation(findViewById(R.id.field_input), Gravity.CENTER, 0, 0);
}
});
/*
if (keyboardLayout.getVisibility() == View.GONE) {
// Show Media Player
TranslateAnimation mAnimUp =
new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, -keyboardLayout.getHeight(),
Animation.RELATIVE_TO_SELF, 0);
mAnimUp.setStartOffset(500);
mAnimUp.setDuration(500);
keyboardLayout.setVisibility(View.VISIBLE);
keyboardLayout.setAnimation(mAnimUp);
}
*/
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
:
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
:
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
:
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
:
}
}
答案 0 :(得分:3)
经过几个小时的“研究和尝试”之后,我终于理解了我的错误,这似乎是“sjngm”的错误。要呈现虚拟键盘,您必须
KeyboardView
来声明视图(正如您对其他View
所做的那样)。findViewById()
检索你的KeyboardView并调用它:
keyboardViewInstance.setKeyboard(new Keyboard(...) );
就是这样。您将能够在屏幕上看到您的keyboardView!当然,您需要创建自己的Keyboard类,或者使用现有的键盘类来定义键盘键(res/xml/keyboard.xml)
的xml资源文件。
答案 1 :(得分:0)
我正在重新发明我的方法,因为我认为我没有打破InputMethodService
足以让它在没有自己的情况下工作。换句话说,我扔掉了样本并从头开始使布局工作(它现在是一个布局而不是两个),然后从示例中添加代码以正确处理输入。
经过进一步研究,我发现了一个关于App-specific soft-keyboard的非常有用的问题。如果遇到我的情况,那就去看看吧。