Search code examples
androidandroid-textinputlayoutandroid-textinputedittext

TextInputLayout display error on orientation change Android


Hi i am using TextInputLayout With TextInputEditText like this

<android.support.design.widget.TextInputLayout
    android:id="@+id/userName_til"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:errorTextAppearance="@style/error_appearance">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/etUserName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/username"
            android:inputType="textEmailAddress"
            android:maxLines="1" />

</android.support.design.widget.TextInputLayout>

Style is

<style name="error_appearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@android:color/holo_red_light</item>
    <item name="android:textSize">12sp</item>
</style>

Java Code is

tilUserName = (TextInputLayout) findViewById(R.id.userName_til);
etUserName = (TextInputEditText) findViewById(R.id.etUserName);

etUserName.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Timber.d("OnTextChanged Called");
        if (s.length() < 1) {
            tilUserName.setErrorEnabled(true);
            tilUserName.setError(getString(R.string.please_enter_email_id));
        } else if (!AppUtils.isValidEmail(s)) {
            tilUserName.setErrorEnabled(true);
        tilUserName.setError(getString(R.string.please_enter_valid_email_id));
        } else {
            tilUserName.setError(null);
            tilUserName.setErrorEnabled(false);
        }

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

I am using...

 compile 'com.android.support:appcompat-v7:25.2.0'
 compile 'com.android.support:design:25.2.0' 

Reference Images portrait While image in Normal time

After landscape changed Landscape mode error displaying time

On orientation changed automatically showing the error hint in EditText.

How can I fix this problem?


Solution

  • Try adding the TextWatcher in a Runnable so that it gets attached after android has restored the state of your edittext. Something like this:

    tilUserName = (TextInputLayout) findViewById(R.id.userName_til);
    etUserName = (TextInputEditText) findViewById(R.id.etUserName);
    etUserName.post(new Runnable() {
            @Override
            public void run() {
                etUserName.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    Timber.d("OnTextChanged Called");
                    if (s.length() < 1) {
                        tilUserName.setErrorEnabled(true);
                        tilUserName.setError(getString(R.string.please_enter_email_id));
                    } else if (!AppUtils.isValidEmail(s)) {
                        tilUserName.setErrorEnabled(true);
                        tilUserName.setError(getString(R.string.please_enter_valid_email_id));
                    } else {
                        tilUserName.setError(null);
                        tilUserName.setErrorEnabled(false);
                    }
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                }
            });
        }
    };
    

    Referenced from Android - onTextChanged() called on when phone orientation is changed.