使用InputMethodManager手动显示软键盘不会调整窗口

时间:2013-03-08 02:57:35

标签: android android-activity android-edittext android-softkeyboard

所以我有一个使用windowSoftInputMode="adjustPan"的活动,我有一个OnPreDrawListener来调用EditText

editText.requestFocus();
inputManager.showSoftInput(editText, 0);

按预期方式工作,然后推动ActivityEditText腾出空间。但是,如果我使用后退按钮(将窗口平移回原始位置)关闭键盘,然后再次触摸EditText以显示键盘,键盘显示,但窗口无法调整。

我甚至尝试在OnClickListener添加EditText并再次拨打同样的两个电话:

editText.requestFocus();
inputManager.showSoftInput(editText, 0);

但窗口不会平移,直到我关闭窗口并再次显示它。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我认为这三个步骤可以解决您的问题。

1)清单文件更改windowSoftInputMode =“adjustPan” 到 windowSoftInputMode =“adjustResize”

2)用于EditText的布局,将父布局更改为ScroolView。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <EditText
        android:id="@+id/edittextview"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:inputType="textFilter"
        android:padding="10dp"
        android:imeOptions="actionDone"
        android:scrollbars="vertical"
        android:textSize="14sp" />
</ScrollView>

3)明确显示键盘以避免“使用后退键和窗口关闭键盘不调整” 在Edittext onclick写

edittext.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                InputMethodManager m = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (m != null) {
                    m.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
                    edittext.requestFocus();
                }
            }
        });

希望这能解决您的问题。

答案 1 :(得分:0)

所以这不是问题的解决方案,但这是我最终的解决方法。我在IME收到它之前创建了一个LinearLayout的子类来拦截后退按钮:

public class IMEInterceptLinearLayout extends LinearLayout {
    //For some reason, the event seems to occur twice for every back press
    //so track state to avoid firing multiple times
    private boolean notifiedListener = false;
    private OnBackPressedPreIMEListener listener;

    public IMEInterceptLinearLayout(Context context) {
        super(context);
    }

    public IMEInterceptLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public IMEInterceptLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setOnBackPressedPreIMEListener(OnBackPressedPreIMEListener listener) {
        this.listener = listener;
    }

    private void fireOnBackPressedPreIME() {
        if(listener != null && !notifiedListener) {
            listener.onBackPressedPreIME();
            notifiedListener = true;
        }
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            fireOnBackPressedPreIME();
            return true;
        } else return super.dispatchKeyEventPreIme(event);
    }

    public interface OnBackPressedPreIMEListener {
        public void onBackPressedPreIME();
    }
}

然后从那里我将窗口注册为布局的监听器,并在收到事件时关闭窗口和键盘,在窗口可见时禁止键盘被解除。