2014-01-13 21 views
0

У меня возникла раздражающая авария в моем приложении, когда пользователь нажимает кнопку «Назад».Сбой приложения для 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... 
    } 

} 
+3

Хм, да, если вы могли бы опубликовать StackTrace, что было бы здорово , – keyboardsurfer

+0

кажется, что ваша деятельность выскочила из стека, когда вы его вызываете, разместите свой метод создания класса, в котором вы попали. По вашему журналу кажется, что что-то передается, на самом деле никогда не прошло – Saqib

+0

Авария в PersonActivity.onCreate() происходит, когда эта строка кода выполняется: 'Intent намерения = getIntent();' '\t this.person = (Person) intent.getSerializableExtra (MainActivity.PERSON_MESSAGE);' Но я думаю, что нажатие на кнопку назад не полностью создает активность снова. Он не создает MainActivity. Авария логична, потому что кнопка «Назад» не ставит дополнительные функции. Но почему onCreate происходит вообще? – Matthias

ответ

0

Это должно быть из-за исключения с нулевым указателем, из-за которого приложение вызывает сбой.

Прежде всего, проверьте, требуется ли в вашей PersonActivity значение, которое не передается/задается при нажатии кнопки «Назад» из вашей AddPaymentActivity.

Вы также можете переопределить функцию onResume(), она будет вызываться при нажатии кнопки возврата.

+0

Передаю необходимый объект через intent.putExtra(). Как я могу сделать это, когда нажата кнопка «Назад»? – Matthias

+0

вы можете переопределить onBackPressed функцию на вашем AddPaymentActivity: '@Override общественного недействительными onBackPressed() { super.onBackPressed(); // optional // вы можете поместить свое намерение здесь, putExtra, startActivity } ' – user3091819

1

Ваша проблема заключается в одном из этих 2-х линий:

this.share = new BigDecimal(intent.getStringExtra(OverviewActivity.SHARE_MESSAGE)); 
this.totalSum = new BigDecimal(intent.getStringExtra(OverviewActivity.SUM_MESSAGE)); 

кажется, что один из ваших 2 getStringExtra возвращения нуля.

0

Убедитесь, что вы не добавили finish(); после вашего намерения. Цель/действие, которое вы хотите вернуть из предыдущего действия, при добавлении этого намерения к родительской активности, убедитесь, что родительская активность, ссылающаяся на это намерение, не имеет финиша() ;.например:

Основная деятельность вызова оплаты деятельности:

Intent d = new Intent(getApplicationContext(), 
       PaymentActivity.class); 
     startActivity(d); 
     finish();***//remove this*** 
     return true; 

если вы говорите активности вызова другой деятельности, чтобы закончить(), это в основном означает, что деятельность под названием может neevr возвращение к прежней деятельности, поэтому это ниже правильна: // послевкусие(); был удален

Intent d = new Intent(getApplicationContext(), 
       PaymentActivity.class); 
     startActivity(d); 
     return true; 

следующая вещь, которую вам нужно сделать, это мак убедитесь, что ваш манифест имеет родительскую активность, добавленную к действиям.

Например:

<activity 
     android:name=".PaymentActivity" 
     android:label="@string/paymentlabel" 
     android:parentActivityName=".PaymentActivity" /> 

И ваша компенсация активность OnCreate добавить следующее:

assert getSupportActionBar() != null;***> //this tells the application that ActionBar is not null and therefore dont call an java null exceptions and crash the activity 

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowHomeEnabled(true); 
Смежные вопросы