這裏是我的onCreate()
方法:的Andorid:無法恢復活動由於NullPointerException異常
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
currentMeasurementType = DEFAULT_TYPE;
final DataBaseHandler handler = new DataBaseHandler(getApplicationContext());
SQLiteDatabase db = handler.getWritableDatabase();
//Spinner for the measurement types
final Spinner measurementTypesSpinner = (Spinner) findViewById(R.id.MeasurementTypes);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
handler.getMeasurementTypes());
adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
measurementTypesSpinner.setAdapter(adapter);
measurementTypesSpinner.setOnItemSelectedListener(this);
//Spinner for the measurement sub types
final Spinner measurementSubTypesSpinner = (Spinner) findViewById(R.id.MeasurementSubValues);
try {
ArrayAdapter<String> subAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
handler.getMeasurementSubType(DEFAULT_TYPE));
subAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
measurementSubTypesSpinner.setAdapter(subAdapter);
//measurementSubTypesSpinner.setOnItemSelectedListener(this); TODO
} catch(NonExistentMeasurementTypeException ex) {
Log.d("failed to initialise the spinner for the measurement units", ex.getMessage());
}
//the value from which the user is converting from
EditText value = (EditText) findViewById(R.id.unit_value);
value.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
unitValue = charSequence.toString();
MeasurementType mType =
MeasurementType.getMeasurementType(measurementTypesSpinner.getSelectedItem().toString());
String unitName = measurementSubTypesSpinner.getSelectedItem().toString();
String unitValue = charSequence.toString();
//create the converter
Converter converter = new Converter(mType, unitName, unitValue);
//convert the values
ArrayList<Unit> convertedValues = converter.convert();
//update the list view adapter
updateUnitAdapter(convertedValues);
}
@Override
public void afterTextChanged(Editable editable) {
//nothing here
}
});
//ListView
ListView unitsView = (ListView) findViewById(R.id.units_list);
unitsView.setItemsCanFocus(true);
MeasurementType type = handler.getMeasurementType(DEFAULT_TYPE);
final ArrayList<Unit> unitsConverted = new ArrayList<Unit>();
unitsConverted.addAll(Arrays.asList(type.getUnits()));
/**for some reason we need to do a clean up
* also going to set the unit values to zero
* for initialisation
*/
for(Unit u : unitsConverted) {
if(u == null) {
unitsConverted.remove(u);
} else {
u.setValue(0.00);
}
}
unitAdapter = new UnitListAdapter(this, unitsConverted, type);
unitsView.setAdapter(unitAdapter);
Button editList = (Button) findViewById(R.id.editList);
editList.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
ArrayList<Unit> units = handler.getUnitsList(currentMeasurementType);
Intent i = new Intent(getApplicationContext(), MeasurementTypeListActivity.class);
i.putParcelableArrayListExtra("units", units);
i.putExtra("measurementType", currentMeasurementType);
startActivity(i);
}
});
}
這裏是我的onResume()
方法:
@Override
protected void onResume() {
super.onResume();
SharedPreferences prefs = this.getSharedPreferences(
"unitconverter", Context.MODE_PRIVATE);
DataBaseHandler handler = new DataBaseHandler(getApplicationContext());
//set the spinner for measurement type
Spinner measurementTypeSpinner = (Spinner) findViewById(R.id.MeasurementTypes);
ArrayAdapter adapter = (ArrayAdapter) measurementTypeSpinner.getAdapter();
int typePos = adapter.getPosition(prefs.getString("currentmeasurementtype", "acceleration"));
measurementTypeSpinner.setSelection(typePos);
//set the spinner for the measurement unit
Spinner measurementUnitSpinner = (Spinner) findViewById(R.id.MeasurementSubValues);
ArrayAdapter arrayAdapter = (ArrayAdapter) measurementUnitSpinner.getAdapter();
int unitPos = arrayAdapter.getPosition(prefs.getString("currentmeasurementunit", "centigal"));
measurementUnitSpinner.setSelection(unitPos);
//set the value
EditText value = (EditText) findViewById(R.id.unit_value);
value.setText(prefs.getString("value", "0.00"));
/**
* The list view stuff
*/
ListView unitsList = (ListView) findViewById(R.id.units_list);
unitsList.setItemsCanFocus(true);
MeasurementType mType = handler.getMeasurementType(prefs.getString("currentmeasurementtype", "acceleration"));
//create the converter
Converter converter = new Converter(MeasurementType.getMeasurementType(prefs.getString("currentmeasurementtype", "acceleration")), prefs.getString("currentmeasurementunit", "centigal"), prefs.getString("value", "0.00"));
//convert the values
ArrayList<Unit> convertedValues = converter.convert();
//update the current adapter
updateUnitAdapter(convertedValues);
}
這裏是堆棧跟蹤:
java.lang.RuntimeException: Unable to resume activity {com.example.UnitConverter/com.example.UnitConverter.MyActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2788)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.example.UnitConverter.MyActivity$1.onTextChanged(MyActivity.java:78)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at com.example.UnitConverter.MyActivity.onResume(MyActivity.java:243)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
at android.app.Activity.performResume(Activity.java:5310)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
所以它試圖做到這一點:
at com.example.UnitConverter.MyActivity$1.onTextChanged(MyActivity.java:78)
之後它放在這裏:
at com.example.UnitConverter.MyActivity.onResume(MyActivity.java:243)
當我看行78,我可以看到這一點:
String unitName = measurementSubTypesSpinner.getSelectedItem().toString();
所以它試圖設置這個變量,它看起來像它要去242線做這件事,242線讀取:
EditText value = (EditText) findViewById(R.id.unit_value);
value.setText(prefs.getString("value", "0.00"));
Thes e實際上是241和242行,建議我沒有初始化EditText
。但我的想法是,試圖從首選項獲取字符串返回空...因爲它可能沒有被保存...
請有人看看?
您必須在onCreate()而不是onResume()中找到所有視圖。 – 2014-09-05 06:09:17
@HareshChhelana對不起,我不明白:「你的全部觀點」,請你解釋一下嗎? – user2405469 2014-09-05 06:12:54
就像你是findViewId()在onResume()所以嘗試findViewId()EditText ListView等onCreate()當您的活動創建時,第一次調用onResume()多次調用,當你再次來到另一個活動的活動。 – 2014-09-05 06:25:27