我正在开发一个 Android 应用程序,我有 2 个编辑视图和一个标签。用户可以输入 2 个值,标签显示使用来自编辑视图的输入进行的一些计算。我想要的是以下内容;
- 用户使用软键盘输入任一值
- 用户按下“返回”软键
- editview 应该失去焦点
- 软键盘应该消失
- 应该重新计算 textview 标签
现在,v.clearFocus 似乎只在有另一个小部件可以获得焦点(?)时才有效,所以我还添加了一个虚拟零像素布局,可以从第一个编辑视图“窃取”焦点。Return 键现在可以使用,但是当用户通过简单的点击将焦点从 edit1 切换到 edit2 时,HideKeyboard() 就会崩溃。我试过检查是否 inputMethodManager==null 但这没有帮助。
这一切都感觉就像我在欺骗 Android 做一些常见的 UI 行为,所以我不禁认为我在这里忽略了一些东西。
任何帮助将不胜感激。顺便说一句,我知道这类似于这个问题:当按下软键盘中的“完成”按钮时,如何失去编辑文本的焦点? 但我已经尝试过了,它不起作用。
所以我的布局xml是这样的:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- Dummy control item so that first textview can lose focus -->
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<EditText
android:id="@+id/editTest1"
android:layout_width="250px"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:imeOptions="actionDone" >
</EditText>
<EditText
android:id="@+id/editTest2"
android:layout_width="250px"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:imeOptions="actionDone" >
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test123" />
</LinearLayout>
来源是这样的:
public class CalcActivity extends Activity implements OnFocusChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab2_weight);
EditText testedit = (EditText) findViewById(R.id.editTest1);
testedit.setOnFocusChangeListener(this);
testedit.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId==EditorInfo.IME_ACTION_DONE){
//Clear focus here from edittext
Log.d("test app", "v.clearFocus only works when there are other controls that can get focus(?)");
v.clearFocus();
}
return false;
}
});
}
public void hideSoftKeyboard() {
InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
}
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == false) {
Log.d("unitconverter", "onFocusChange hasFocus == false");
// update textview label
TextView bla = (TextView) findViewById(R.id.textView1);
bla.setText(String.format("%s + %s", (((EditText) findViewById(R.id.editTest1)).getText()), (((EditText) findViewById(R.id.editTest2)).getText())));
// hide keyboard
hideSoftKeyboard();
}
}
}