Android 在片段中的EditText外部单击关闭键盘
我有一个片段,包含一个用于搜索输入的EditText和一个ListView。我已经让搜索部分工作了,但是现在我想在用户单击EditText之外的屏幕时关闭键盘。我还想使用click事件(因为它是一个ListView,如果我不使用click事件,用户可能会意外地单击他们不想打开的ListView项目) 我知道如何在活动中做到这一点,但对于片段来说似乎有所不同 到目前为止,我所尝试的:Android 在片段中的EditText外部单击关闭键盘,android,listview,android-fragments,listener,Android,Listview,Android Fragments,Listener,我有一个片段,包含一个用于搜索输入的EditText和一个ListView。我已经让搜索部分工作了,但是现在我想在用户单击EditText之外的屏幕时关闭键盘。我还想使用click事件(因为它是一个ListView,如果我不使用click事件,用户可能会意外地单击他们不想打开的ListView项目) 我知道如何在活动中做到这一点,但对于片段来说似乎有所不同 到目前为止,我所尝试的: 在片段中实现View.OnClickListener,并实现onClick如下: @Override publi
- 在片段中实现
,并实现onClick如下:View.OnClickListener
@Override public void onClick(View v) { System.out.println("onClick true"); if (!(v instanceof EditText)) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context. INPUT_METHOD_SERVICE); if (getActivity().getCurrentFocus() != null) { imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0); } } }
- 在片段的活动中重写onTouchEvent并实现onTouchEvent,如下所示:
@Override public boolean onTouchEvent(final MotionEvent event) { InputMethodManager imm = (InputMethodManager) getSystemService(Context. INPUT_METHOD_SERVICE); if (getCurrentFocus() != null) { imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } return true; }
任何帮助都将不胜感激。提前感谢。如果我没弄错,您可以尝试使用OnFocusChangeListener:
yourEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
final InputMethodManager inputManager = (InputMethodManager) getAppContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputManager != null && !hasFocus) {
inputManager.hideSoftInputFromWindow(currentFocusedView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
这只是一个示例,但可能指向了正确的方向。如果我没弄错,您可以尝试使用OnFocusChangeListener:
yourEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
final InputMethodManager inputManager = (InputMethodManager) getAppContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputManager != null && !hasFocus) {
inputManager.hideSoftInputFromWindow(currentFocusedView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
这只是一个示例,但可能它指向了正确的方向。试试这个
在xml文件中
android:clickable="true"
android:focusableInTouchMode="true"
创建方法
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
调用方法
edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
hideKeyboard(v);
}
}
});
试试这个
在xml文件中
android:clickable="true"
android:focusableInTouchMode="true"
创建方法
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
调用方法
edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
hideKeyboard(v);
}
}
});
关闭软键盘的代码如下:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
您可以将它放在实用程序类中,或者如果您在活动中定义它,则可以避免使用活动参数,或者调用hideSoftKeyboard(此)
您可以编写一个方法,迭代活动中的每个视图,并检查它是否是EditText的实例,如果它没有向该组件注册setOnTouchListener,则所有内容都将就位。如果你想知道怎么做,其实很简单。下面是您要做的,您可以编写一个递归方法,如下所示
public void setupUI(View view) {
//Set up touch listener for non-text box views to hide keyboard.
if(!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard();
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}
public void setupUI(视图){
//为非文本框视图设置触摸监听器以隐藏键盘。
如果(!(查看EditText的实例)){
view.setOnTouchListener(新的OnTouchListener(){
公共布尔onTouch(视图v,运动事件){
隐藏键盘();
返回false;
}
});
}
//如果是布局容器,则在子对象上迭代并为递归设定种子。
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
视图内部视图=((视图组)视图);
setupUI(内部视图);
}
}
}
在SetcontentView()之后调用此方法,参数作为视图的id,如:
RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
RelativeLayoutPanel android:id=“@+id/parent”>。。。
然后调用setupUI(findviewbyd(R.id.parent))
参考资料:关闭软键盘的代码如下:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
您可以将它放在实用程序类中,或者如果您在活动中定义它,则可以避免使用活动参数,或者调用hideSoftKeyboard(此)
您可以编写一个方法,迭代活动中的每个视图,并检查它是否是EditText的实例,如果它没有向该组件注册setOnTouchListener,则所有内容都将就位。如果你想知道怎么做,其实很简单。下面是您要做的,您可以编写一个递归方法,如下所示
public void setupUI(View view) {
//Set up touch listener for non-text box views to hide keyboard.
if(!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard();
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}
public void setupUI(视图){
//为非文本框视图设置触摸监听器以隐藏键盘。
如果(!(查看EditText的实例)){
view.setOnTouchListener(新的OnTouchListener(){
公共布尔onTouch(视图v,运动事件){
隐藏键盘();
返回false;
}
});
}
//如果是布局容器,则在子对象上迭代并为递归设定种子。
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
视图内部视图=((视图组)视图);
setupUI(内部视图);
}
}
}
在SetcontentView()之后调用此方法,参数作为视图的id,如:
RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
RelativeLayoutPanel android:id=“@+id/parent”>。。。
然后调用setupUI(findviewbyd(R.id.parent))
参考资料:谢谢,解释得很好。谢谢,解释得很好。