У меня возникла раздражающая авария в моем приложении, когда пользователь нажимает кнопку «Назад».Сбой приложения для Android при нажатии кнопки «Назад»
В моем приложении, у меня есть 3 соответствующие мероприятия:
- MainActivity: показывает список лиц
- PersonActivity: отображает список всех платежей человека
- AddPaymentActivity: есть элементы ввода добавить платеж лицу
Из MainActivity пользователь может либо нажать на имя Лица в списке, чтобы перейти к PersonActivity, либо использовать кнопку «+» рядом с именем пользователя e и перейти непосредственно в AddPaymentActivity. В PersonActivity есть кнопка «+», которая также приводит к AddPaymentActivity.
Данные Perons хранятся в классе Java Person, который реализует интерфейс Serializable. При запуске Activty я переадресовать Person объект с помощью
intent.putExtra(MainActivity.PERSON_MESSAGE, person);
Когда я иду от MainActivity непосредственно в AddPaymentActivity (через «+»), тонкая кнопка назад работает. Однако, если я использую запуск AddPaymentActivity из PersonActivity, мое приложение выходит из строя с исключительным исключением.
С помощью отладчика я заметил, что PersonActivity.onCreate() вызывается (снова?) При нажатии кнопки «Назад». Почему это происходит при возврате формы AddPaymentActivity к PersonActivity? И почему это НЕ происходит при возврате из AddPaymentActivity в MainActivity? Что я могу сделать, чтобы исправить эту проблему?
Стек трассировки:
01-13 10:11:01.423: E/AndroidRuntime(1022): FATAL EXCEPTION: main
01-13 10:11:01.423: E/AndroidRuntime(1022): Process: de.emteg.cashsplit, PID: 1022
01-13 10:11:01.423: E/AndroidRuntime(1022): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.emteg.cashsplit/de.emteg.cashsplit.PersonActivity}: java.lang.NullPointerException
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.access$700(ActivityThread.java:135)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.os.Handler.dispatchMessage(Handler.java:102)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.os.Looper.loop(Looper.java:137)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.main(ActivityThread.java:4998)
01-13 10:11:01.423: E/AndroidRuntime(1022): at java.lang.reflect.Method.invokeNative(Native Method)
01-13 10:11:01.423: E/AndroidRuntime(1022): at java.lang.reflect.Method.invoke(Method.java:515)
01-13 10:11:01.423: E/AndroidRuntime(1022): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-13 10:11:01.423: E/AndroidRuntime(1022): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-13 10:11:01.423: E/AndroidRuntime(1022): at dalvik.system.NativeStart.main(Native Method)
01-13 10:11:01.423: E/AndroidRuntime(1022): Caused by: java.lang.NullPointerException
01-13 10:11:01.423: E/AndroidRuntime(1022): at java.math.BigDecimal.<init>(BigDecimal.java:425)
01-13 10:11:01.423: E/AndroidRuntime(1022): at de.emteg.cashsplit.PersonActivity.onCreate(PersonActivity.java:37)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.Activity.performCreate(Activity.java:5243)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
01-13 10:11:01.423: E/AndroidRuntime(1022): ... 11 more
MainActivity.onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
persons = new ArrayList<Person>();
// Populate list with some test person objects
Person p = new Person("Frank");
p.getPayments().add(new Payment("test1", new BigDecimal(5.7)));
persons.add(p);
p = new Person("Peter");
persons.add(p);
ListView list = (ListView) findViewById(R.id.listView1);
PersonAdapter adapter = new PersonAdapter();
list.setAdapter(adapter);
// output....
}
PersonActivity.onCreate():
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_person);
Intent intent = getIntent();
this.person = (Person) intent.getSerializableExtra(MainActivity.PERSON_MESSAGE);
this.share = new BigDecimal(intent.getStringExtra(MainActivity.SHARE_MESSAGE));
this.totalSum = new BigDecimal(intent.getStringExtra(MainActivity.SUM_MESSAGE));
this.diff = person.getSum().subtract(share);
setupActionBar();
// output...
}
AddPaymentActivty.onCreate():
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_payment);
// Show the Up button in the action bar.
setupActionBar();
Intent intent = getIntent();
this.person = (Person) intent.getSerializableExtra(MainActivity.PERSON_MESSAGE);
if (intent.hasExtra(MainActivity.PAYMENT_MESSAGE)) {
this.payment = (Payment) intent.getSerializableExtra(MainActivity.PAYMENT_MESSAGE);
// output....
} else {
this.payment = null;
// output...
}
}
Хм, да, если вы могли бы опубликовать StackTrace, что было бы здорово , – keyboardsurfer
кажется, что ваша деятельность выскочила из стека, когда вы его вызываете, разместите свой метод создания класса, в котором вы попали. По вашему журналу кажется, что что-то передается, на самом деле никогда не прошло – Saqib
Авария в PersonActivity.onCreate() происходит, когда эта строка кода выполняется: 'Intent намерения = getIntent();' '\t this.person = (Person) intent.getSerializableExtra (MainActivity.PERSON_MESSAGE);' Но я думаю, что нажатие на кнопку назад не полностью создает активность снова. Он не создает MainActivity. Авария логична, потому что кнопка «Назад» не ставит дополнительные функции. Но почему onCreate происходит вообще? – Matthias