Android 基于软键盘显示/隐藏视图

Android 基于软键盘显示/隐藏视图,android,android-layout,Android,Android Layout,我的处境很困难。我需要在显示软键盘时隐藏某些视图,并在软键盘隐藏时将其显示出来 我尝试过不同的方法,通过解决方法检测软键盘的可见性,并相应地显示/隐藏视图,但事务处理并不平滑,在显示时整个布局会闪烁 下面是一些类似于我想要的东西 是否有其他替代方法可以在不必解决软键盘可见性问题的情况下进行类似操作 谢谢。我想你可能想扭转局面,而不是检测软键盘的可见性,然后控制它 我使用的代码是: public static void showKeyboard(Activity activity) {

我的处境很困难。我需要在显示软键盘时隐藏某些视图,并在软键盘隐藏时将其显示出来

我尝试过不同的方法,通过解决方法检测软键盘的可见性,并相应地显示/隐藏视图,但事务处理并不平滑,在显示时整个布局会闪烁

下面是一些类似于我想要的东西

是否有其他替代方法可以在不必解决软键盘可见性问题的情况下进行类似操作


谢谢。

我想你可能想扭转局面,而不是检测软键盘的可见性,然后控制它

我使用的代码是:

public static void showKeyboard(Activity activity) {
    if (activity == null || activity.getCurrentFocus() == null)
        return;

    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    // will only trigger if no physical keyboard is open
    inputMethodManager.showSoftInput(activity.getCurrentFocus(), InputMethodManager.SHOW_IMPLICIT);
}

public static void hideKeyboard(Activity activity) {
    if (activity == null || activity.getCurrentFocus() == null)
        return;

    InputMethodManager imm = (InputMethodManager) activity.getSystemService(
            Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
我还有第三种隐藏键盘的方法。单击“确定/取消”时,显示编辑文本以强制键盘关闭的对话框中需要此选项:

public static void hideKeyboard(Context c, IBinder windowToken) {
    InputMethodManager mgr = (InputMethodManager) c
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    mgr.hideSoftInputFromWindow(windowToken, 0);
}
用法:

Util.hideKeyboard(getActivity(), editText.getWindowToken());
如果不更详细地了解“某些观点”的含义,就很难回答。您可以使用任何软输入模式平移/调整大小等,还是需要更多自定义行为


您可以在视图根目录上使用解决方法技巧,例如OnGloballYoutListener,但由于它经常被调用,因此成本很高。InputMethodManager上有一些方法请求显示/隐藏IME,并使用结果调用回调,但并不总是可靠的。您的用例是一个非常常见的描述问题,但根据您试图完成的具体内容,很难推荐任何内容。

我通过覆盖EditText并向其添加一个接口OnCloseSoftKeyboardListener解决了类似的问题,该接口在软键盘关闭时被调用:

public class MyEditText extends EditText {

private OnCloseSoftKeyboardListener mBackButtonListener;
private OnTouchListener mTouchListener;

// HANDLING OF SOFT KEYBOARD BACK BUTTON
public void setOnCloseSoftKeyboardListener(OnCloseSoftKeyboardListener callback) {
    mBackButtonListener = callback;
}


/**
 * Overrides the handling of the back key to move fields or whatever, instead of dismissing the input method.
 */
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if (mBackButtonListener != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
        if (mBackButtonListener.onCloseSoftKeyboard(this)) {
            return true;
        }
    }

    return super.dispatchKeyEventPreIme(event);
}


public interface OnCloseSoftKeyboardListener {

    /**
     * @param myEditText 
     * @return true if event was consumed, false otherwise
     */
    boolean onCloseSoftKeyboard(EditText view);
}
}
在您的活动中,您实现了接口:

public class MyActivity implements OnCloseSoftKeyboardListener {

MyEditText mTextView; 
(...)

mTextView.setOnCloseSoftKeyboardListener(this);
(...)

@Override
public boolean onCloseSoftKeyboard(EditText view) {

    // do what you need to do...

    return false;
}

如果您还向EditText添加OnTouchListener,则可以处理软键盘的打开和关闭。

从图片的外观来看,您希望在使用自定义输入视图时禁用软键盘?您可以发布当前实现吗?@SMR当前实现基于“特定视图”的回答分别是查看寻呼机和文本视图。在上图中,键盘不可见,请注意,有一个文本视图(编辑文本下方)和一个视图寻呼机(编辑文本上方)。在键盘可见的第二个图像中,TextView和ViewPager不可见。