Android 在片段中的EditText外部单击关闭键盘

Android 在片段中的EditText外部单击关闭键盘,android,listview,android-fragments,listener,Android,Listview,Android Fragments,Listener,我有一个片段,包含一个用于搜索输入的EditText和一个ListView。我已经让搜索部分工作了,但是现在我想在用户单击EditText之外的屏幕时关闭键盘。我还想使用click事件(因为它是一个ListView,如果我不使用click事件,用户可能会意外地单击他们不想打开的ListView项目) 我知道如何在活动中做到这一点,但对于片段来说似乎有所不同 到目前为止,我所尝试的: 在片段中实现View.OnClickListener,并实现onClick如下: @Override publi

我有一个片段,包含一个用于搜索输入的EditText和一个ListView。我已经让搜索部分工作了,但是现在我想在用户单击EditText之外的屏幕时关闭键盘。我还想使用click事件(因为它是一个ListView,如果我不使用click事件,用户可能会意外地单击他们不想打开的ListView项目)

我知道如何在活动中做到这一点,但对于片段来说似乎有所不同

到目前为止,我所尝试的:

  • 在片段中实现
    View.OnClickListener
    ,并实现onClick如下:

    @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);
            }
        }
    }
    
当我点击时,这似乎从未发布过“onClick true”

  • 在片段的活动中重写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))


参考资料:

谢谢,解释得很好。谢谢,解释得很好。