Android 应用程序在方向更改时崩溃 java.lang.IllegalArgumentException:错误的状态类 - 期望视图状态

发布于 2024-10-18 10:27:19 字数 21820 浏览 7 评论 0原文

我的 Android 应用程序遇到了另一个问题,我找不到答案,基本上我有一个以编程方式创建的 Android 视图,然后当我更改设备的方向时,应用程序崩溃,原因是:

java.lang.IllegalArgumentException:错误的状态类——期望视图状态

我尝试使用 onConfigurationChange 方法再次设置内容视图,但我不知道我是否在这里吠叫了错误的树。我已经包含了日志中的完整类和错误,以防有帮助。

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


    }
}

堆栈跟踪:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盛夏尉蓝 2024-10-25 10:27:19

该特定异常的源代码似乎已更新为一条更有用的错误消息:

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

我可以看到您在代码中使用了 ID 1009 两次,这可能与此有关。

理想情况下,您将使用 XML 进行布局。它将使您的生活变得更加轻松。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文