所以我有一个使用windowSoftInputMode="adjustPan"
的活动,我有一个OnPreDrawListener
来调用EditText
:
editText.requestFocus();
inputManager.showSoftInput(editText, 0);
按预期方式工作,然后推动Activity
为EditText
腾出空间。但是,如果我使用后退按钮(将窗口平移回原始位置)关闭键盘,然后再次触摸EditText
以显示键盘,键盘显示,但窗口无法调整。
我甚至尝试在OnClickListener
添加EditText
并再次拨打同样的两个电话:
editText.requestFocus();
inputManager.showSoftInput(editText, 0);
但窗口不会平移,直到我关闭窗口并再次显示它。有什么建议吗?
答案 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();
}
}
然后从那里我将窗口注册为布局的监听器,并在收到事件时关闭窗口和键盘,在窗口可见时禁止键盘被解除。