2013-03-14 31 views
27

EditTextがあり、フォーカスが失われたとき(キーボードが不要な要素)、ソフトキーボードが自動的に非表示になるか、または自分で非表示にする必要がありますか?ソフトキーボードがフォーカスを失うのを隠す

私はtrueを返しますrequestFocus()、(私は推測EditTextのように振る舞うべきです)AutoCompleteSearchViewからButtonにフォーカスを移動するんだけど、キーボードが非表示になりません。

+0

自動的に隠れるはずです。あなたもこれをやろうとしましたか? –

+4

私はそれが私が求めている理由です。 – FWeigl

+0

@Ascorbinそれを駄目にしないでください。アンドロイドはこれを世話します.. – Pragnani

答えて

53

ベストな方法からより多くの情報を見つけることができますがのEditTextのためOnFocusChangeListenerを設定し、リスナーのOnFocusChangeメソッドにキーボードにコードを追加することです。 EditTextがフォーカスを失ったら、Androidは自動的にキーボードを閉じます。その後、

EditText editText = (EditText) findViewById(R.id.textbox); 
OnFocusChangeListener ofcListener = new MyFocusChangeListener(); 
editText.setOnFocusChangeListener(ofcListener); 

とクラスを追加します:

あなたのOnCreateメソッドでは、このような何か

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); 

     } 
    } 
} 
+10

これは、アプリケーションの各editTextコンポーネントに対して実行する必要がありますか?この動作を定義するグローバルな設定はありませんか?そうでない場合、アプリケーションに多くのeditTextがある場合は、editTextクラスを拡張し、拡張クラスにリスナーを追加し、アプリケーションに沿って変更されたクラスを使用することをお勧めします。 – GyRo

+4

自動的に作成する方法は?私は150から25のフォームを持っている場合、私は毎回それをしたくない...この機能は明らかにする必要があります。 – Loenix

4

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); 
} 
+1

すばらしい答えありがとう –

2

は、これを試してみてください、それはあなたの問題を解決しますように。

private void hideKeyboard() { 
    InputMethodManager mImMan = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    mImMan.hideSoftInputFromWindow(mYourEdttxtName.getWindowToken(), 0); 
} 

あなたはhere.

5

あなたはそれを達成するためにdispatchTouchEventメソッドをオーバーライドすることができ、この

/** 
* 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(); 
     } 
    } 
} 
0

をお試しください:

EditTextの場合がフォーカスを得て、イベントの順序トリガーである:(つまり、他のEditTextがフォーカスを失っている場合)、別のEditTextの

  1. onFocusChange()呼ばれる
  2. ACTION_DOWNされるボーナスは
    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
    
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
    
         /** 
         * It gets into the above IF-BLOCK if anywhere the screen is touched. 
         */ 
    
         View v = getCurrentFocus(); 
         if (v instanceof EditText) { 
    
    
          /** 
          * Now, it gets into the above IF-BLOCK if an EditText is already in focus, and you tap somewhere else 
          * to take the focus away from that particular EditText. It could have 2 cases after tapping: 
          * 1. No EditText has focus 
          * 2. Focus is just shifted to the other EditText 
          */ 
    
          Rect outRect = new Rect(); 
          v.getGlobalVisibleRect(outRect); 
          if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) { 
           v.clearFocus(); 
           InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
           imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
          } 
         } 
        } 
        return super.dispatchTouchEvent(event); 
    } 
    

  3. 最後に、そのEditTextのonFocusChange()メソッドが呼び出されます。
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); 
} 
0

ソリューションは、すでにhereを発見された(断片で)このコードで解決しました。
アクティビティで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); 
    } 
1

だけ

public static void touchScreenAndHideKeyboardOnFocus(View view, final Activity activity) { 

    if (view instanceof EditText) { 
     view.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if (!hasFocus) { 
        if(activity != null) { 
         InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); 
         if (activity.getCurrentFocus() != null) { 
          inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
         } 
        } 
       } 
      } 
     }); 
    } 

    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      View innerView = ((ViewGroup) view).getChildAt(i); 
      touchScreenAndHideKeyboardOnFocus(innerView, activity); 
     } 
    } 
} 

ビューは、あなたのレイアウトのルートビューです..しかし、あなたは別のフォーカスを持っている場合は、注意が必要つの静的メソッドを作成しますあなたの編集文のリスナー..

+0

「強制」とは何ですか? – Hatim

+0

@Hatim upssごめんなさい..私の元の方法.. –

関連する問題