我有一个片段与EditText和添加到使用事务的布局。但是如果我旋转到横屏,软键盘就消失了。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getSupportFragmentManager().findFragmentById(R.id.fragmentContainer) == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.fragmentContainer, new FragmentWithEditText())
.commit();
}
}
}
我希望在使用片段事务旋转后键盘状态保持不变。因为如果我不使用事务,而是在布局中直接添加一个片段,键盘不会消失。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:tag="fragmentWithKeyboard"
android:name="com.test.FragmentWithEditText"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
我已经尝试使用android:windowSoftInputMode="stateUnchanged"
或android:configChanges="keyboardHidden|orientation"
,但没有帮助。
我还写了一个示例应用程序与此行为https://github.com/anton9088/FragmentAndKeyboard
相似的问题:
在方向改变时保持软输入/IME状态
Android尝试将EditText的属性freezesText值设置为true
你也可以在onViewCreated回调中手动添加焦点
问题
问题是我们的视图应该将windowSoftInputMode
设置为stateUnchanged
,这意味着:
当活动出现时,软键盘将保持在它最后的状态,无论是可见还是隐藏。
在一个活动中,它可以通过简单地在AndroidManifest.xml
中添加以下内容来获得:
<activity
...
android:windowSoftInputMode="stateUnchanged"/>
遗憾的是,它不能用于片段。
DialogFragment
解决方案如果你的片段是一个DialogFragment
,你可以通过添加以下代码到你的onCreateDialog
方法,而你已经创建了一个对话框:
Window window = dialog.getWindow();
if (window != null) {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
}
在清单中更改以下行,我相信它会对您有所帮助
<activity
android:name=".YourActivityName"
android:configChanges="orientation|screenSize">
</activity>
所以替换你的
android:configChanges="keyboardHidden|orientation"
来android:configChanges="orientation|screenSize"