android - statealwayshidden - view focusable
editTextはフォーカスを失っていません (3)
必要に応じてXMLレイアウトにonClick
リスナーを作成して、LinearLayoutのバックグラウンドでクリックをリッスンします。 ここからは、あなたが作業中のアクティビティのインスタンス変数にした後で.clearFocus()
を呼び出すことができます。
私はそれをクリックしたときにeditTextは私のアプリでフォーカスを失っていない、それはオレンジ色の境界線と黒い線のカーソルを持っています..これは、EditTextを囲んでこれに従ってLinearLayoutを行いました:だから、それはアプリの開始に焦点を当てていない..
これは私のコードです:
final EditText et = (EditText)findViewById(R.id.EditText01);
final InputMethodManager imm = (InputMethodManager) getSystemService(
INPUT_METHOD_SERVICE);
et.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);
}
});
et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasfocus) {
if(hasfocus) {
imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);
} else {
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
}
}
});
しかし、editTextの外のどこかをクリックすると、onFocusChangeを呼び出すようには見えません!
メソッドを呼び出すことによってフォーカスを他のフィールドに設定することによって、EditTextからフォーカスを削除できます。
終了ボタンのクリック時に戻るボタンにフォーカスを設定した後、終了ボタンクリックリスナ内の戻るボタン上でメソッドを呼び出すとします。
そしてあなたの問題は解決されます。
back.requestFocusFromTouch();
オーバーライドActivity.dispatchTouchEvent()
:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View view = getCurrentFocus();
if (view != null && view instanceof EditText) {
Rect r = new Rect();
view.getGlobalVisibleRect(r);
int rawX = (int)ev.getRawX();
int rawY = (int)ev.getRawY();
if (!r.contains(rawX, rawY)) {
view.clearFocus();
}
}
}
return super.dispatchTouchEvent(ev);
}
そうすれば、誰かがどこかをクリックするたびに、コントロールがあり、コード内の1つのポイントにしかなりません。