I have a fragment with EditText and add it into the layout using transactions. But if I rotate to landscape the soft keyboard disappears.
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();
}
}
}
I want keyboard state still unchanged after rotate using fragment transactions. Because if I don't use transactions, but add a fragment straight in the layout, the keyboard not disappeared.
<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>
I already tried to use android:windowSoftInputMode="stateUnchanged"
or android:configChanges="keyboardHidden|orientation"
, but didn't help.
Also I wrote a sample app with this behavior https://github.com/anton9088/FragmentAndKeyboard
Similar questions:
Retain soft-input/IME state on Orientation change
Keyboard dismissed on rotation to landscape mode Android
When you rotate your device and the screen changes orientation, Android usually destroys your application's existing Activities and Fragments and recreates them . Android does this so that your application can reload resources based on the new configuration.
Some device configurations can change during runtime (such as screen orientation, keyboard availability, and when the user enables multi-window mode). When such a change occurs, Android restarts the running Activity ( onDestroy() is called, followed by onCreate() ).
Some device configurations change while the application is running, such as when the device changes its orientation. Such a change restarts the activity by calling all its methods again.
Try to set your EditText's attribute freezesText value to true.
You can also add focus in onViewCreated callback manually
The problem is that our view should has windowSoftInputMode
set to stateUnchanged
which means:
The soft keyboard is kept in whatever state it was last in, whether visible or hidden, when the activity comes to the fore.
In an activity it can be obtained by simply change in AndroidManifest.xml
by adding this:
<activity
...
android:windowSoftInputMode="stateUnchanged"/>
Unfortunately it will not work for fragments.
If your fragment is a DialogFragment
you can obtain it by adding this code to your onCreateDialog
method while you have already created a dialog:
Window window = dialog.getWindow();
if (window != null) {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With