がありEditText
、それが (キーボードを必要としない要素に) フォーカスを失った場合、ソフト キーボードは自動的に非表示にする必要がありますか? それとも、自分で非表示にする必要がありますか?
フォーカスを(私が推測AutoCompleteSearchView
するように動作するはずです)からに移動していますが、trueを返しますが、キーボードは非表示になりません。EditText
Button
requestFocus()
がありEditText
、それが (キーボードを必要としない要素に) フォーカスを失った場合、ソフト キーボードは自動的に非表示にする必要がありますか? それとも、自分で非表示にする必要がありますか?
フォーカスを(私が推測AutoCompleteSearchView
するように動作するはずです)からに移動していますが、trueを返しますが、キーボードは非表示になりません。EditText
Button
requestFocus()
最善の方法は、EditText に OnFocusChangeListener を設定し、キーボードのコードをリスナーの OnFocusChange メソッドに追加することです。EditText がフォーカスを失うと、Android は自動的にキーボードを閉じます。
OnCreate メソッドで次のようにします。
EditText editText = (EditText) findViewById(R.id.textbox);
OnFocusChangeListener ofcListener = new MyFocusChangeListener();
editText.setOnFocusChangeListener(ofcListener);
次に、クラスを追加します。
private class MyFocusChangeListener implements OnFocusChangeListener {
public void onFocusChange(View v, boolean hasFocus){
if(v.getId() == R.id.textbox && !hasFocus) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
}
Androidはキーボードを隠しません。フォーカスを失ったときにキーボードを非表示にする場合はEditText
、そのイベントで次のような方法を使用してみてください。
private void hideKeypad() {
EditText edtView = (EditText) findViewById(R.id.e_id);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edtView.getWindowToken(), 0);
}
これを試して
/**
* Hide keyboard on touch of UI
*/
public void hideKeyboard(View view) {
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
hideKeyboard(innerView);
}
}
if (!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(v);
return false;
}
});
}
}
/**
* Hide keyboard while focus is moved
*/
public void hideSoftKeyboard(View view) {
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) contentsContext_
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputManager != null) {
if (android.os.Build.VERSION.SDK_INT < 11) {
inputManager.hideSoftInputFromWindow(view.getWindowToken(),
0);
} else {
if (this.getCurrentFocus() != null) {
inputManager.hideSoftInputFromWindow(this
.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
view.clearFocus();
}
view.clearFocus();
}
}
}
これを試してみてください。問題が解決するかもしれません。
private void hideKeyboard() {
InputMethodManager mImMan = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
mImMan.hideSoftInputFromWindow(mYourEdttxtName.getWindowToken(), 0);
}
この問題の解決策は、ここですでに見つかりました。
アクティビティで DispatchTouchEvent を使用しており、すべての EditText を FocusChange または Touch イベントにフックするわけではありません。
それははるかに優れたソリューションです。
私の Xamarin の実装は次のとおりです。
public override bool DispatchTouchEvent(MotionEvent ev)
{
if (ev.Action == MotionEventActions.Down)
{
var text = CurrentFocus as EditText;
if (text != null)
{
var outRect = new Rect();
text.GetGlobalVisibleRect(outRect);
if (outRect.Contains((int) ev.RawX, (int) ev.RawY)) return base.DispatchTouchEvent(ev);
text.ClearFocus();
HideSoftKeyboard();
}
}
return base.DispatchTouchEvent(ev);
}
protected void HideSoftKeyboard()
{
var inputMethodManager = (InputMethodManager) GetSystemService(InputMethodService);
inputMethodManager.HideSoftInputFromWindow(CurrentFocus.WindowToken, 0);
}
私の問題はこのコードで解決しました(フラグメント内)
LinearLayout linearLayoutApply=(LinearLayout)rootView.findViewById(id.LinearLayoutApply);
linearLayoutApply.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus)
{
hideKeyBoard(v);
}
}
});
hideKeyBoard
public void hideKeyBoard(View v)
{
InputMethodManager imm=(InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
}