你所描述的设计不被推荐。你正在违反 focusable
属性的目的,该属性的作用并不是控制用户是否可以更改 EditText
组件中的文本。
如果您计划提供替代输入方法,因为使用情况似乎需要这样做(例如,您只允许在可编辑文本字段中输入特定集合的符号),那么您应该在用户不被允许更改该字段的值的时间内完全禁用文本编辑。
声明您的可编辑字段:
<EditText
android:id="@+id/edit_text_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" />
请注意,focusable
属性仍保留默认值。没关系,稍后我们会处理它。声明一个按钮,它将启动编辑过程:
<Button
android:id="@+id/button_show_ime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start editing" />
现在,在你的Activity
中声明:
private EditText editText2;
private KeyListener originalKeyListener;
private Button buttonShowIme;
在onCreate()
中做如下操作:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ime_activity);
editText2 = (EditText)findViewById(R.id.edit_text_2);
originalKeyListener = editText2.getKeyListener();
editText2.setKeyListener(null);
buttonShowIme = (Button)findViewById(R.id.button_show_ime);
buttonShowIme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText2.setKeyListener(originalKeyListener);
editText2.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText2, InputMethodManager.SHOW_IMPLICIT);
}
});
editText2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText2.getWindowToken(), 0);
editText2.setKeyListener(null);
}
}
});
}
我希望代码及其注释都是自说明的。在 API 8 和 17 上测试通过。
EditText
为什么一开始就不能聚焦?你是如何实现的?使用 XML 还是具体用了哪些属性? - andrandroid:focusable="false"
。 - Dodo