gpt4 book ai didi

Android 应用程序在方向更改时崩溃 java.lang.IllegalArgumentException : Wrong state class -- expecting View State

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:36 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

关于Android 应用程序在方向更改时崩溃 java.lang.IllegalArgumentException : Wrong state class -- expecting View State,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com