Spinner populated by database force closing when phone is rotated
I am developing an android which consists of a List View populated by a blank database table with first option as "Create New". When the user clicks on "Create New" a form is loaded which the user fills up and on clicking Save in the form this is stored in the database table of list view. Again when the user opens this list view it will have Create New as well as the form filled by user as options say Create New and Form 1. There are few spinners in the form which are populated by an another table in the database
Everything is fine till here. When the user clicks on Form1 it loads the form he has filled for editing.
The problem I am facing is whenever the user loads the form and rotates the phone it is being FORCE CLOSED. Same thing is happening with list view also. Whenever I am in listview and rotate the Phone it is getting FORCE CLOSED.
here is my logcat
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): FATAL EXCEPTION: main
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): java.lang.NullPointerException
08-15 09:39:36.759: ERROR/AndroidRuntime(6481):at com.sufoin.mormeds.Submit$2.onItemSelected(Submit.java:366)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.AdapterView.fireOnSelected(AdapterView.java:871)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.AdapterView.selectionChanged(AdapterView.java:854)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.AdapterView.checkSelectionChanged(AdapterView.java:977)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.AdapterView.handleDataChanged(AdapterView.java:959)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:179)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.TableRow.measureChildBeforeLayout(TableRow.java:221)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:701)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.TableRow.onMeasure(TableRow.java:112)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.TableLayout.measureChildBeforeLayout(TableLayout.java:456)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.TableLayout.measureVertical(TableLayout.java:468)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.TableLayout.onMeasure(TableLayout.java:431)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:701)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.onMeasure(LinearLayout.java:311)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1082)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.ScrollView.onMeasure(ScrollView.java:296)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.View.measure(View.java:8330)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.view.ViewRoot.handleMessage(ViewRoot.java:1860)
08-15 09:39:36.759: ERROR/AndroidRuntime(64开发者_Go百科81): at android.os.Handler.dispatchMessage(Handler.java:99)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.os.Looper.loop(Looper.java:123)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at android.app.ActivityThread.main(ActivityThread.java:3835)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at java.lang.reflect.Method.invokeNative(Native Method)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at java.lang.reflect.Method.invoke(Method.java:507)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
08-15 09:39:36.759: ERROR/AndroidRuntime(6481): at dalvik.system.NativeStart.main(Native Method)
Here is my code where the error has occured. it is used to initialize and set spinners
private void initandsetspinners(final Spinner gen, final Spinner prinum, final Spinner alternum, final Spinner precon, final Spinner dep, final Spinner pra, final Spinner add) {
//Initializing the shared preferences variable
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
//Creating an object called mydbhelper
Dbms mydbhelper = new Dbms(this);
//Loading the database in writable format
final SQLiteDatabase db=mydbhelper.getWritableDatabase();
//For Medicines Table
try{
//For medicines
Cursor medspin = db.query("medicines", null,null,null,null,null,null);
medspin.moveToPosition(prefs.getInt("pos",1));
//Filling the variables to set selemedspintion
deptpos=medspin.getInt(medspin.getColumnIndex("provider_department"));
practipos=medspin.getInt(medspin.getColumnIndex("provider_practice"));
addrpos=medspin.getInt(medspin.getColumnIndex("provider_address"));
hsname=medspin.getString(medspin.getColumnIndex("healthsystem"));
medspin.close();
//For user_masterdata table
Cursor userspin = db.query("user_masterdata", null,null,null,null,null,null);
userspin.moveToPosition(0);
//Filling the variables to set seleuserspintion
genpos=userspin.getInt(userspin.getColumnIndex("gender"));
pripos=userspin.getInt(userspin.getColumnIndex("primarynumbertype"));
altpos=userspin.getInt(userspin.getColumnIndex("alternatenumbertype"));
prefpos=userspin.getInt(userspin.getColumnIndex("prefcontactype"));
userspin.close();
}
catch(Exception e){
Log.e("Error","Error",e);
}
//Initializing the spinners
//Gender
ArrayAdapter<CharSequence> gentype = ArrayAdapter.createFromResource(this,R.array.gender, android.R.layout.simple_spinner_item);
gentype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
gen.setAdapter(gentype);
//Primary Number
ArrayAdapter<CharSequence> prinumtype = ArrayAdapter.createFromResource(this,R.array.pnumtype, android.R.layout.simple_spinner_item);
prinumtype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
prinum.setAdapter(prinumtype);
//Alternate Number
ArrayAdapter<CharSequence> altnumtype = ArrayAdapter.createFromResource(this,R.array.anumtype, android.R.layout.simple_spinner_item);
altnumtype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
alternum.setAdapter(altnumtype);
//Preferred Contact type
ArrayAdapter<CharSequence> preftype = ArrayAdapter.createFromResource(this,R.array.precontype, android.R.layout.simple_spinner_item);
preftype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
precon.setAdapter(preftype);
try{
//Cursor
Cursor depcur = db.rawQuery("SELECT _id,department,"+prefs.getString("hsname",null)+ " FROM dept_masterdata WHERE "+prefs.getString("hsname",null)+"=1",null);
depcur.moveToFirst();
startManagingCursor(depcur);
String[] from = new String[]{"department"};
int[] to = new int[] { android.R.id.text1 };
// Now creating an array adapter and set it to display using my row
//Adaptor for Department
SimpleCursorAdapter deptype =new SimpleCursorAdapter(this,android.R.layout.simple_spinner_item, depcur, from, to);
deptype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
dep.setAdapter(deptype);
}
catch(Exception e){
Log.e("Error","Error",e);
}
//Now determine which department is selected
//Department
dep.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int pos,long id){
deptid=dep.getSelectedItemId();
//Setting the practice spinner based on the department selected
Cursor pracur = db.rawQuery("SELECT _id,practice,dept_link,hs_id FROM practice_masterdata WHERE dept_link="+deptid+" AND hs_id="+(prefs.getInt("hsid",0)),null);
pracur.moveToFirst();
startManagingCursor(pracur);
String[] from1 = new String[]{"practice"};
int[] to1 = new int[]{android.R.id.text1};
SimpleCursorAdapter practype =new SimpleCursorAdapter(view.getContext(),android.R.layout.simple_spinner_item, pracur, from1, to1);
practype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
pra.setAdapter(practype);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//Practice
pra.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int pos,long id){
practid=pra.getSelectedItemId();
//Setting the address based on the practice selected
Cursor addcur =db.rawQuery("SELECT * FROM address_masterdata WHERE practice_link="+practid,null);
addcur.moveToFirst();
startManagingCursor(addcur);
String[] from2 = new String[]{"address"};
int[] to2 = new int[]{android.R.id.text1};
SimpleCursorAdapter addtype =new SimpleCursorAdapter(view.getContext(),android.R.layout.simple_spinner_item,addcur, from2, to2);
addtype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
add.setAdapter(addtype);
practicename=pra.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//Address
add.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int pos,long id){
addrid=add.getSelectedItemId();
addressname=add.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//Getting the info
//Gender
gen.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int pos,long id){
gender=parent.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//Primary Number
prinum.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int pos,long id){
primarynumbertype=parent.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//Alternate Number
alternum.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int pos,long id){
alternatenumbertype=parent.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//Preferred Contact type
precon.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int pos,long id){
prefferedcontactype=parent.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//Setting the spinners based on the above variables
gen.setSelection(genpos);
prinum.setSelection(pripos);
alternum.setSelection(altpos);
precon.setSelection(prefpos);
dep.setSelection(deptpos);
pra.setSelection(practipos);
add.setSelection(addrpos);
}
Line 366 is SimpleCursorAdapter practype =new SimpleCursorAdapter(view.getContext(),android.R.layout.simple_spinner_item, pracur, from1, to1);
Please Kindly help me out
Regards Chinni krishna
As others have mentioned, when you change landscape, your Activity is being created again. Without seeing the code causing this, I wouldn't be able to help fix it. But if all else fails, you can set the following on your Activity in the Android Manifest to not re-create the Activity on orientation change:
<activity android:name="MainActivity" android:configChanges="orientation|keyboardHidden"></activity>
I think this is the problem. When you rotate your phone, your Activty is being destroyed and rebuilt, so it is losing the Cursors
(I'm guessing you are using Cursors
to access your database). Try closing the Cursors
in onStop()
and creating them in onStart()
(and if that doesn't work, try onDestroy()
/onCreate()
or onPause()
/onResume()
EDIT:
Declare it as a member variable in your class:
Cursor cursor = null;
Initialise in your try block:
try {
cursor = new Cursor(blah, blah);
}
This in in onDestroy
:
if(cursor!=null) {
cursor.close();
}
精彩评论