3

我的 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
4

1 回答 1

4

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

 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 进行布局。它会让你的生活变得更加轻松。

于 2011-02-20T19:44:17.567 回答