【问题标题】:how to hide soft keyboard in fragments?如何在片段中隐藏软键盘?
【发布时间】:2017-05-28 11:22:32
【问题描述】:

我想在android的片段中隐藏键盘。因为一旦它显示它在所有片段中仍然可见。我试试这个方法

    public static void hideKeyboard(Context ctx) {
    InputMethodManager inputManager = (InputMethodManager) ctx
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    // check if no view has focus:
    View v = ((Activity) ctx).getCurrentFocus();
    if (v == null)
        return;

    inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

并在按钮单击时调用此方法

signIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                hideKeyboard(ctx);
                login();


        }
    });

但这会给出错误“java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on an null object reference”

【问题讨论】:

  • 你为什么要找一些视图?将 View v 作为参数传递给 hideKeyboard 方法,v.getContext() 将为您提供正确的上下文,这将是具有 2 行代码的方法
  • 您是否已使用 Context 对象初始化或分配 ctx
  • @ViktorYakunin 请用代码详细说明你的答案...

标签: android android-fragments


【解决方案1】:

对于 Java

试试这个

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

要调用它,只需通过单击按钮时传递以下代码

signIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
               hideSoftKeyboard(getActivity());
                login();


        }
    });

对于 Kotlin

fun hideSoftKeyboard(activity:Activity) {
  if (activity.getCurrentFocus() == null){
    return
  }
  val inputMethodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0)
}

通过单击按钮传递以下代码

signIn.setOnClickListener(object:View.OnClickListener() {
  fun onClick(v:View) {
    hideSoftKeyboard(getActivity())
    login()
  }
})

【讨论】:

  • 这不适用于碎片,在 mate 20 pro 设备上
【解决方案2】:
signIn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       hideKeyboard(v);
       login();
   }
});

还有一些实用程序类中的隐藏键盘方法

public static void hideKeyboard(@NonNull View v) {
    InputMethodManager inputManager = (InputMethodManager) v.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

【讨论】:

    【解决方案3】:

    将此用于 kotlin 用户 创建一个文件并添加此代码

    fun hideSoftKeyboard(activity: Activity) {
        if (activity.currentFocus == null) {
            return
        }
        val inputMethodManager =
            activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(activity.currentFocus!!.windowToken, 0)
    }
    

    现在在任何地方调用这个方法

    hideSoftKeyboard(requireActivity())
    

    快乐的编码.. kotlin 的NB

    【讨论】:

      【解决方案4】:

      使用片段视图中的窗口标记隐藏它

      对于 Kotlin -

      if (activity != null){
          // Hide soft keyboard
          val imm =
              activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
          imm.hideSoftInputFromWindow(requireView().windowToken, 0)
      }
      

      【讨论】:

        【解决方案5】:

        试试这个:

        View view = this.getCurrentFocus();
        if (view != null) {
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-12-17
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 2023-01-09
          • 2014-10-29
          • 2015-09-29
          • 1970-01-01
          • 2011-12-24
          相关资源
          最近更新 更多