我实现了一个简单的EditText,它提供了一个Done按钮来隐藏键盘,在旋转到横向时,它不会显示EditText的全屏对话框。但这是一个问题。当我点击完成以关闭键盘然后我将设备旋转到横向时,键盘出现。如果我再次关闭它然后旋转到肖像键盘再次出现。
如何在旋转时保持键盘可见性状态 - 如果它在旋转前被隐藏,则在旋转后不显示它,但如果在旋转之前它是可见的,那么在旋转后显示它?
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/editText1"
android:inputType="text"
android:imeOptions="flagNoFullscreen|actionDone" />
我尝试在父容器(RelativeLayout)中设置android:descendantFocusability="beforeDescendants"
和android:focusableInTouchMode="true"
,但这并没有影响此行为。
答案 0 :(得分:1)
有两种选择..
在onCreate()
方法中尝试使用这些选项
选项1。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
选项2
edittext.clearFocus();
此选项将焦点设置回活动中的第一个可聚焦视图。
<强> 编辑: 强>
如果您自己的edittext是您活动中的第一个可聚焦视图,则选项2将无效,因为clearFocus
会将焦点设置回活动中的第一个可聚焦视图。
选项1的用法:
public class MyActivity extends Activity {
EditText editText1;
boolean isKeyBoardOpen=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
editText1 = (EditText) findViewById(R.id.editText1);
if(savedInstanceState!=null &&(savedInstanceState.getBoolean("isKeyBoardOpen",false)))
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
else this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
final View activityRootView = findViewById(R.id.root_layout);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
isKeyBoardOpen=true;
}else isKeyBoardOpen=false;
}
});
}
protected void onSaveInstanceState(final Bundle bundle) {
super.onSaveInstanceState(bundle);
bundle.putBoolean("isKeyBoardOpen",isKeyBoardOpen);
}
}
答案 1 :(得分:0)
有很多方法可以做,但我给你2
在配置更改时,1 覆盖onConfigurationChange方法,看看键盘是否打开,你可以通过保存它的值来表示布尔值,并且在onConfigurationChange之后更改使用该布尔值显示或隐藏键盘的值。
2 如果你没有实现onConfigurationChange方法,另一种方法是在onSaveInstanceState中保存状态并在onRestoreInstanceState中检索它,如下所示。
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
//get the status of keyboard
boolean status = isKeyboardVisible(){this is your method or your logic};
outState.putBoolean(key, status)
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
boolean status = savedInstanceState.getBoolean(key);
//based on status show or hide keyboard.
}