Android app crashes on orientation change java.lang.IllegalArgumentException: Wrong state class — expecting View State

StackOverflow https://stackoverflow.com/questions/5059439

質問

I am having another problem with my android app which I can't find an answer to basically I have an android view that has been created programmatically, then when I change the orientation of my device the application crashes due to:

java.lang.IllegalArgumentException: Wrong state class -- expecting View State

I have tried to use the onConfigurationChange method to then set the content view again but I don't know if I am barking up the wrong tree here. I have included the full class and error from the log in case it helps.

package org.project.accessible;

import java.io.IOException;
import android.app.Activity; 
import android.app.AlertDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.text.InputType;
import android.text.method.PasswordTransformationMethod;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.widget.*;

public class RegisterScreen extends Activity implements View.OnClickListener{
     private EditText username; 
     private EditText password; 
     private EditText password2;
     private EditText email; 
     private EditText surname; 
     private EditText forename; 
     private EditText street;
     private EditText postcode;
     private EditText city;
     private EditText county;
     private String country;
     private int checkboxAmount;
     private LinearLayout layoutMain;
    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        //initiate the database to be qureied
        DatabaseData db = new DatabaseData(this);
        db = new DatabaseData(this);
        try {
                db.createDataBase();
            } 
        catch (IOException ioe) {
            throw new Error("Unable to create database");
            }
        try { 
            db.openDataBase();
            }
        catch(SQLException sqle){
            throw sqle;
            }
        SQLiteDatabase rdb = db.getReadableDatabase();

        //main layout of the screen     
        layoutMain = new LinearLayout(this);
        layoutMain.setOrientation(LinearLayout.VERTICAL);
        layoutMain.setBackgroundColor(Color.WHITE);

            //Linear Layout for the Banner
            LinearLayout banner = new LinearLayout(this);
            banner.setOrientation(LinearLayout.VERTICAL);
            banner.setBackgroundColor(Color.rgb(17, 168, 191));

                //layout params for height and width
                LayoutParams bannerParams = new android.widget.LinearLayout.LayoutParams(
                        android.widget.LinearLayout.LayoutParams.FILL_PARENT, 40);
                banner.setLayoutParams(bannerParams);

                //Banner text
                TextView bannerText = new TextView(this);
                bannerText.setText("Register");
                bannerText.setTextColor(Color.WHITE);
                banner.addView(bannerText);
                bannerText.setTextSize(24);
                bannerText.setGravity(Gravity.CENTER);

                //add banner layout to main layout
                layoutMain.addView(banner);

            //Scroll view for the rest of the screen
            ScrollView sv = new ScrollView(this);
            //sv.setFillViewport(true);

                    //Table layout to align the items register form items
                    TableLayout tl = new TableLayout(this);

                    //Table rows to put items on left and right sides of the page
                    TableRow usernameTR = new TableRow(this);

                        //Username label
                        TextView usernameL = new TextView(this);
                        usernameL.setText("Username:");
                        usernameL.setTextColor(Color.BLACK);
                        usernameTR.addView(usernameL);

                        //Username textbox
                        EditText usernameTB = new EditText(this);
                        usernameTB.setId(1001);
                        usernameTB.setSingleLine(true);
                        usernameTR.addView(usernameTB);
                        tl.addView(usernameTR);

                        TableRow passwordTR = new TableRow(this);

                        //password label
                        TextView passwordL = new TextView(this);
                        passwordL.setText("Password:");
                        passwordL.setTextColor(Color.BLACK);
                        passwordTR.addView(passwordL);

                        //password textbox
                        EditText passwordTB = new EditText(this);
                        passwordTB.setId(1009);
                        passwordTB.setSingleLine(true);
                        passwordTB.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                        passwordTB.setTransformationMethod(PasswordTransformationMethod.getInstance());
                        passwordTR.addView(passwordTB);
                        tl.addView(passwordTR);

                        TableRow password2TR = new TableRow(this);

                        //password2 label
                        TextView password2L = new TextView(this);
                        password2L.setText("Confirm Pass:");
                        password2L.setTextColor(Color.BLACK);
                        password2TR.addView(password2L);

                        //password2 textbox
                        EditText password2TB = new EditText(this);
                        password2TB.setId(1010);
                        password2TB.setSingleLine(true);
                        password2TB.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                        password2TB.setTransformationMethod(PasswordTransformationMethod.getInstance());
                        password2TR.addView(password2TB);
                        tl.addView(password2TR);

                    TableRow emailTR = new TableRow(this);

                        //email label
                        TextView emailL = new TextView(this);
                        emailL.setText("Email:");
                        emailL.setTextColor(Color.BLACK);
                        emailTR.addView(emailL);

                        //email textbox
                        EditText emailTB = new EditText(this);
                        emailTB.setId(1002);
                        emailTB.setSingleLine(true);
                        emailTR.addView(emailTB);
                        tl.addView(emailTR);

                    TableRow forenameTR = new TableRow(this);

                        //forename label
                        TextView forenameL = new TextView(this);
                        forenameL.setText("Forename:");
                        forenameL.setTextColor(Color.BLACK);
                        forenameTR.addView(forenameL);

                        //forename textbox
                        EditText forenameTB = new EditText(this);
                        forenameTB.setId(1003);
                        forenameTB.setSingleLine(true);
                        forenameTR.addView(forenameTB); 
                        tl.addView(forenameTR);

                    TableRow surnameTR = new TableRow(this);

                        //surname label
                        TextView surnameL = new TextView(this);
                        surnameL.setText("Surname:");
                        surnameL.setTextColor(Color.BLACK);
                        surnameTR.addView(surnameL);

                        //surname textbox
                        EditText surnameTB = new EditText(this);
                        surnameTB.setId(1004);
                        surnameTB.setSingleLine(true);
                        surnameTR.addView(surnameTB);   
                        tl.addView(surnameTR);

                    TableRow streetTR = new TableRow(this);

                        //street label
                        TextView streetL = new TextView(this);
                        streetL.setText("Street:");
                        streetL.setTextColor(Color.BLACK);
                        streetTR.addView(streetL);

                        //street textbox
                        EditText streetTB = new EditText(this);
                        streetTB.setId(1005);
                        streetTB.setSingleLine(true);
                        streetTR.addView(streetTB); 
                        tl.addView(streetTR);

                    TableRow postcodeTR = new TableRow(this);

                        //postcode label
                        TextView postcodeL = new TextView(this);
                        postcodeL.setText("Postcode:");
                        postcodeL.setTextColor(Color.BLACK);
                        postcodeTR.addView(postcodeL);

                        //postcode textbox
                        EditText postcodeTB = new EditText(this);
                        postcodeTB.setId(1006);
                        postcodeTB.setSingleLine(true);
                        postcodeTR.addView(postcodeTB); 
                        tl.addView(postcodeTR);

                    TableRow cityTR = new TableRow(this);       

                        //city label
                        TextView cityL = new TextView(this);
                        cityL.setText("City:");
                        cityL.setTextColor(Color.BLACK);
                        cityTR.addView(cityL);

                        //city textbox
                        EditText cityTB = new EditText(this);
                        cityTB.setId(1007);
                        cityTB.setSingleLine(true);
                        cityTR.addView(cityTB); 
                        tl.addView(cityTR);

                    TableRow countyTR = new TableRow(this);

                        //county label
                        TextView countyL = new TextView(this);
                        countyL.setText("County:");
                        countyL.setTextColor(Color.BLACK);
                        countyTR.addView(countyL);

                        //county textbox
                        EditText countyTB = new EditText(this);
                        countyTB.setId(1008);
                        countyTB.setSingleLine(true);
                        countyTR.addView(countyTB); 
                        tl.addView(countyTR);

                        TableRow countryTR = new TableRow(this);

                        //country label
                        TextView countryL = new TextView(this);
                        countryL.setText("Country:");
                        countryL.setTextColor(Color.BLACK);
                        countryTR.addView(countryL);

                        //country dropdown  
                        Spinner countrySpinner = new Spinner(this);
                        countrySpinner.setId(1009);
                        countrySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                              country = parent.getItemAtPosition(pos).toString();
                            }
                            public void onNothingSelected(AdapterView<?> parent) {
                            }
                        });

                        //get array of countries
                        Countries countries = new Countries();
                        String countriesList[] = countries.getList();
                        ArrayAdapter<String> countriesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countriesList);
                        countrySpinner.setAdapter(countriesAdapter);
                        //add the array to the dropdown 
                        countryTR.addView(countrySpinner);
                        tl.addView(countryTR);


                    TextView catTitle = new TextView(this);
                    catTitle.setText("\nPlease select the categories which affect you:\n");
                    catTitle.setTextColor(Color.BLACK);
                    tl.addView(catTitle);
                    //categories
                    //categories title
                    String[] cols =  {"_id", "cat_name"}; //columns to be searched
                    Cursor cursor = rdb.query("aa_category", cols, null, null, null, null, null);   // save the query to the db
                    checkboxAmount = cursor.getCount();
                    while (cursor.moveToNext()) { 
                        CheckBox catCB = new CheckBox(this);
                        String name = cursor.getString(1);
                        int id = cursor.getInt(0);
                        catCB.setId(id);
                        catCB.setText("\n"+name+"\n");
                        catCB.setTextColor(Color.BLACK);
                        tl.addView(catCB);
                        }
                    cursor.close();
                    rdb.close();
                    //add field for new category with a text field that will become active on clicking the checkbox
                    Button submitButton = new Button(this);
                    submitButton.setId(99);
                    submitButton.setText("Submit");


                tl.addView(submitButton);

                //Add table layout to the scroll view
                sv.addView(tl);
                //Add scroll view to the main layout
            layoutMain.addView(sv);
        this.setContentView(layoutMain);
        View submitButtonListener = findViewById(99);
        submitButtonListener.setOnClickListener(this);
        }
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
          super.onConfigurationChanged(newConfig);
          this.setContentView(layoutMain);
        }
        public void onClick(View v) {

            String messageString = null;
            //String usernameStr = null;
            //save the id of the edit text fields to a variable
            username = (EditText)findViewById(1001);
            password = (EditText)findViewById(1009);
            password2 = (EditText)findViewById(1010);
            email = (EditText)findViewById(1002);
            forename = (EditText)findViewById(1003);
            surname = (EditText)findViewById(1004);
            street = (EditText)findViewById(1005);
            postcode = (EditText)findViewById(1006);
            city = (EditText)findViewById(1007);
            county = (EditText)findViewById(1008);
            //save the edit text values
            String usernameStr = username.getText().toString();
            String passwordStr = password.getText().toString();
            String passwordStr2 = password2.getText().toString();
            String emailStr = email.getText().toString();
            String forenameStr = forename.getText().toString();
            String surnameStr = surname.getText().toString();
            String streetStr = street.getText().toString();
            String postcodeStr = postcode.getText().toString();
            String cityStr = city.getText().toString();
            String countyStr = county.getText().toString();
            String checkboxStr = "";

            int checkBoxCheck = 0;
            for(int i = 1; i<=checkboxAmount; i++){
                 CheckBox cbx = (CheckBox)findViewById(i);
                 if(cbx.isChecked()){
                     if(checkBoxCheck == 0){
                     checkboxStr += i;
                     checkBoxCheck ++;
                     }
                     else{
                         checkboxStr += ":" + i; 
                     }
                 }
            }



            //Check for nulls

            if(usernameStr.equals("")){
                messageString = "Username can't be blank please check and try again";
            }
            else if(emailStr.equals("")){
                messageString = "Email can't be blank please check and try again";
            }
            else if(forenameStr.equals("")){
                messageString = "Forename can't be blank please check and try again";
            }
            else if(surnameStr.equals("")){
                messageString = "Surname can't be blank please check and try again";
            }
            else if(streetStr.equals("")){
                messageString = "Street can't be blank please check and try again";
            }
            else if(postcodeStr.equals("")){
                messageString = "Postcode can't be blank please check and try again";
            }
            else if(cityStr.equals("")){
                messageString = "City can't be blank please check and try again";
            }
            else if(countyStr.equals("")){
                messageString = "County can't be blank please check and try again";
            }
            else if(country.equals("") || country.equals("Please select a country")){
                messageString = "Please select a country";
            }
            else if(checkBoxCheck == 0){
                messageString = "You must select at least one category";
            }
            else if(passwordStr.equals("")){
                messageString = "Password can't be blank please check and try again";
            }
            else if(passwordStr2.equals("")){
                messageString = "Confirm pass can't be blank please check and try again";
            }
            else if(!passwordStr.equals(passwordStr2)){
                messageString = "Passwords don't match please check and try again";             
            }
            else{
                //get checkbox values

                messageString = "New user added";
                ConnectionToDb connec = new ConnectionToDb();
                connec.registerUser(usernameStr, passwordStr, emailStr, forenameStr, surnameStr, streetStr, postcodeStr, cityStr, countyStr, country, checkboxStr);
            }
            new AlertDialog.Builder(this)

            .setTitle("Accessible Application")

            .setMessage(messageString)

            .setNeutralButton("Ok",

            new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog,

            int which) {

            }

            }).show();


    }
}

Stacktrace:

I/WindowManager(   84): Setting rotation to 1, animFlags=1
I/WindowManager(   84): Config changed: { scale=1.0 imsi=0/0 loc=en_GB touch=3 keys=2/1/1 nav=3 orien=2 layout=18}
D/StatusBar(   84): updateResources
D/AndroidRuntime( 1357): Shutting down VM
W/dalvikvm( 1357): threadid=3: thread exiting with uncaught exception (group=0x4001da28)
E/AndroidRuntime( 1357): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 1357): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.project.accessible/org.project.accessible.RegisterScreen}: java.lang.IllegalArgumentException: Wrong state class -- expecting View State
E/AndroidRuntime( 1357):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 1357):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 1357):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3502)
E/AndroidRuntime( 1357):    at android.app.ActivityThread.access$2200(ActivityThread.java:116)
E/AndroidRuntime( 1357):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1798)
E/AndroidRuntime( 1357):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1357):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1357):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 1357):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1357):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 1357):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 1357):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 1357):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1357): Caused by: java.lang.IllegalArgumentException: Wrong state class -- expecting View State
E/AndroidRuntime( 1357):    at android.view.View.onRestoreInstanceState(View.java:5713)
E/AndroidRuntime( 1357):    at android.widget.TextView.onRestoreInstanceState(TextView.java:2408)
E/AndroidRuntime( 1357):    at android.view.View.dispatchRestoreInstanceState(View.java:5689)
E/AndroidRuntime( 1357):    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1125)
E/AndroidRuntime( 1357):    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1125)
E/AndroidRuntime( 1357):    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1125)
E/AndroidRuntime( 1357):    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1125)
E/AndroidRuntime( 1357):    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1125)
E/AndroidRuntime( 1357):    at android.view.View.restoreHierarchyState(View.java:5668)
E/AndroidRuntime( 1357):    at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1506)
E/AndroidRuntime( 1357):    at android.app.Activity.onRestoreInstanceState(Activity.java:833)
E/AndroidRuntime( 1357):    at android.app.Activity.performRestoreInstanceState(Activity.java:805)
E/AndroidRuntime( 1357):    at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1172)
E/AndroidRuntime( 1357):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2378)
E/AndroidRuntime( 1357):    ... 12 more
役に立ちましたか?

解決

The source code for that particular exception appears to have been updated with a rather more helpful error message:

 protected void onRestoreInstanceState(Parcelable state) {
        mPrivateFlags |= SAVE_STATE_CALLED;
        if (state != BaseSavedState.EMPTY_STATE && state != null) {
            throw new IllegalArgumentException("Wrong state class, expecting View State but "
                    + "received " + state.getClass().toString() + " instead. This usually happens "
                    + "when two views of different type have the same id in the same hierarchy. "
                    + "This view's id is " + ViewDebug.resolveId(mContext, getId()) + ". Make sure "
                    + "other views do not use the same id.");
        }
    }

I can see that you are using ID 1009 twice in your code, which might have something to do with it.

Ideally you would be using XML for your layout. It'll make your life significantly easier.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top