user1275972
user1275972

Reputation: 131

Keyboard disappears on orientation change

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

Upvotes: 7

Views: 2331

Answers (3)

Wojtek
Wojtek

Reputation: 1348

Problem

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.

Solution for DialogFragment

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);
}

Upvotes: 1

Kishan Soni
Kishan Soni

Reputation: 816

Change below lines in your manifest i am sure it will helps you

<activity
android:name=".YourActivityName"
android:configChanges="orientation|screenSize">
</activity>

So replace your

android:configChanges="keyboardHidden|orientation" To android:configChanges="orientation|screenSize"

Upvotes: -1

Alexander Blinov
Alexander Blinov

Reputation: 393

Try to set your EditText's attribute freezesText value to true.

You can also add focus in onViewCreated callback manually

Upvotes: 1

Related Questions