Sunday, August 19, 2012

EditText keep no change after orientation changed

As mentioned in the post "Activity will be re-started when screen orientation changed", onCreate() method will be called when orientation changed, to re-layout the screen. But in case of some views, such as EditText, the Android life-cycle mechanism will restore the states.

orientation changed


Here is a example, there are two EditText in the layout. The first one is assigned with a ID, it will update the TextView once text changed. The second one have no ID assigned. You can notice that the text in the first EditText (with ID) will keep no change after orientation changed, and onTextChanged() method of the TextChangedListener will be called also, to update the TextView.

On the other hand, the second EditText (without ID assigned) will clear to empty when orientation changed.

Layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
    <TextView
        android:id="@+id/lasttext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:context=".MainActivity" />
    <EditText
        android:id="@+id/intext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:context=".MainActivity" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:context=".MainActivity" />

</LinearLayout>


package com.example.androidorientationchange;

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
 
 TextView lastText;
 EditText inText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        lastText = (TextView)findViewById(R.id.lasttext);
        
     inText = (EditText)findViewById(R.id.intext);
     inText.addTextChangedListener(new TextWatcher(){

   @Override
   public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    
   }

   @Override
   public void beforeTextChanged(CharSequence s, int start, int count,
     int after) {
    // TODO Auto-generated method stub
    
   }

   @Override
   public void onTextChanged(CharSequence s, int start, int before,
     int count) {
    // TODO Auto-generated method stub
    
    
    lastText.setText(s);
    
    Toast.makeText(MainActivity.this, 
         "onTextChanged: " + s, Toast.LENGTH_SHORT).show();
   }});
     
     Toast.makeText(MainActivity.this, 
       "onCreate", Toast.LENGTH_LONG).show();
    }

}


Next:
- Retrieve old activity state for configuration change by overriding onRetainNonConfigurationInstance() method

No comments: