【问题标题】:android hide keyboard method(error when focus lose)android隐藏键盘方法(失去焦点时出错)
【发布时间】:2015-05-07 08:19:16
【问题描述】:

我有一些带有 EditTexts 的片段。当我在第一个片段上的 EditText 中编写文本时,我打开下一个片段。如何隐藏键盘?

我正在这样做:

public static void hideSoftKeyboard(Activity activity) {
        InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
    }

但是如果我返回第一个片段并再次打开下一个片段焦点丢失。我有错误。

我找到了

EditText myEditText = (EditText) findViewById(R.id.myEditText);  
InputMethodManager imm = (InputMethodManager)getSystemService(
      Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

但是我在片段上有很多字段,并且有很多带有字段的片段。我不想重复代码。

我的错误是:

java.lang.NullPointerException
            at com.skip.client.customer.utils.Utils.hideSoftKeyboard(Utils.java:13)
            at com.skip.client.customer.fragments.auth_fragments.SignUpChooseTypeAuthFragment$EventHandler.onValidationSucceeded(SignUpChooseTypeAuthFragment.java:102)
            at com.mobsandgeeks.saripaar.Validator.triggerValidationListenerCallback(Validator.java:673)
            at com.mobsandgeeks.saripaar.Validator.validateFieldsWithCallbackTill(Validator.java:651)
            at com.mobsandgeeks.saripaar.Validator.validateUnorderedFieldsWithCallbackTill(Validator.java:633)
            at com.mobsandgeeks.saripaar.Validator.validate(Validator.java:313)
            at com.mobsandgeeks.saripaar.Validator.validate(Validator.java:274)
            at com.skip.client.customer.fragments.auth_fragments.SignUpChooseTypeAuthFragment$EventHandler.onClick(SignUpChooseTypeAuthFragment.java:89)
            at android.view.View.performClick(View.java:4637)
            at android.view.View$PerformClick.run(View.java:19422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5586)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

标签: android android-edittext android-keypad


【解决方案1】:

您可以将View 传递给您的hideSoftKeyboard 方法并从ViewgetContext() 获取上下文。

public static void hideSoftKeyboard(View view) {
    InputMethodManager inputMethodManager =
        (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
  }

需要说传递Activity 可能是个坏主意,因为这可能需要memory leaks,这很难调试和修复。

【讨论】:

    【解决方案2】:

    试试

        public static void hideSoftKeyboard(Activity activity, View view) {
              if(activity!= null && !activity.isFinish() && view != null) 
              {
                 InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
                 inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
              }
        }
    

    【讨论】:

      【解决方案3】:

      使用此代码

      private void hideSoftKeyBoard(ScrollView view){
          InputMethodManager inputManager = (InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
          inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
      }
      

      这对我有用。

      【讨论】:

        【解决方案4】:

        尝试为我工作

        public static void hideSoftKeyboard(Activity activity) {
            if (null != activity.getWindow()){
            activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
          }
        }
        

        【讨论】:

          【解决方案5】:
           public static void hideKeyboard(Activity activity) {
              // Check if no view has focus:
              View view = activity.getCurrentFocus();
              if (view != null) {
                  InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                  inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-20
            • 2017-02-16
            • 1970-01-01
            • 2012-03-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多