私は Android アプリに取り組んでおり、2 つの editview と 1 つのラベルがあります。ユーザーは 2 つの値を入力でき、ラベルには編集ビューからの入力を使用した計算が表示されます。私が欲しいのは次のとおりです。
- ユーザーはソフトキーボードでいずれかの値を入力します
- ユーザーが「戻る」ソフトキーを押す
- editviewはフォーカスを失うべきです
- ソフトキーボードが消えるはずです
- textview ラベルを再計算する必要があります
現在、v.clearFocus は、フォーカス (?) を取得できる別のウィジェットがある場合にのみ機能するように思われるため、最初の editview からフォーカスを「盗む」ことができるダミーのゼロ ピクセル レイアウトも追加しました。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();
}
}
}