Activity和Fragment中点击EditText之外的空白区域使软键盘消失

使软键盘消失的方法如下:

public static void hintKeyboard(Activity activity) {
	InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
	if (imm.isActive() && activity.getCurrentFocus() != null) {
		if (activity.getCurrentFocus().getWindowToken() != null) {
			imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}
}

点击空白地方使输入框消失代码如下可以在activity中重写onTouchEvent:

// 点击空白区域 自动隐藏软键盘
public boolean onTouchEvent(MotionEvent event) {
	if(null != this.getCurrentFocus()){
		/**
		 * 点击空白位置 隐藏软键盘
		 */
		InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
		return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
	}
	return super .onTouchEvent(event);
}

在fragment中由于没有onTouchEvent重写所以可以在onCreateView中,对view使用以下方法:

view.setOnTouchListener(new OnTouchListener() {
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		 InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
		 if(event.getAction() == MotionEvent.ACTION_DOWN){  
			 if(getActivity().getCurrentFocus()!=null && getActivity().getCurrentFocus().getWindowToken()!=null){  
			   manager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  
			 }  
		  }  
		return false;
	}
});

或者在activity中重写onTouchEvent然后在fragment中调用如下方法:
 

view.setOnTouchListener(new View.OnTouchListener() {
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		getActivity().onTouchEvent(event);
		return false;
	}
});

上面的问题都不大,但是当你的activity或者fragment中包含scrollview的时候,你会发现你的onTouchEvent()根本不会得到调用,这个时候你就慌了,接着你会去想方法设法的实现touch,click,focus监听,然而你会发现然并卵,你就会去思考,能不能重写scrollview来拦截touch事件,然而你会发现仍然是然并卵,那么到底如何解决呢?

步骤如下

1、设置一个公共的方法 用来隐藏软键盘

public static void hintKeyboard(Activity activity) {
	InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
	if (imm.isActive() && activity.getCurrentFocus() != null) {
		if (activity.getCurrentFocus().getWindowToken() != null) {
			imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}
}

2、在BaseActivity中或者BaseFragment中这样来调用:

/**
 * 设置点击软键盘之外区域,软键盘消失
 *
 * @param view
 */
public void setHintKeyboardView(View view) {
	if (!(view instanceof EditText)) {
		view.setOnTouchListener(new View.OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				hintKeyboard(getActivity());
				return false;
			}
		});
	}
	if (view instanceof ViewGroup) {
		for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
			View innerView = ((ViewGroup) view).getChildAt(i);
			setHintKeyboardView(innerView);
		}
	}
}

大功告成!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现点击 EditText 弹出键盘的功能,你可以按照以下步骤进行操作: 1. 首先,在你的布局文件找到你的 EditText 对应的 XML 声明,确保设置了正确的 ID。例如,你可以在 XML 文件添加以下代码: ```xml <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" ...其他属性设置... /> ``` 2. 在你的 ActivityFragment 找到对应的 Java/Kotlin 文件,并在该文件获取 EditText 的实例。例如,你可以在 onCreate 方法添加以下代码: ```java EditText editText = findViewById(R.id.editText); ``` 3. 接下来,你需要为 EditText 设置点击事件监听器,当用户点击时弹出键盘。在同一个方法添加以下代码: ```java editText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } }); ``` 4. 最后,记得在 AndroidManifest.xml 文件的对应 ActivityFragment 的节点添加软键盘的配置。例如,在 `<activity>` 节点添加以下代码: ```xml <activity android:name=".YourActivity" android:windowSoftInputMode="stateHidden|adjustResize" > ... </activity> ``` 这样,当用户点击 EditText 时,键盘将弹出显示。请确保替换代码的 "YourActivity" 为你实际使用的 Activity 类名。希望这个解答对你有帮助!如有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值