2012-12-18 95 views
0

我的應用程序出現問題。 我有一個名爲PetActivity的活動。在這個活動中有一些值...和一個按鈕(更新)。這個按鈕會將用戶切換到另一個名爲UpdateActivity的活動,他可以在其中編輯來自PetActivity的值。有一個保存按鈕應該完成這個活動並重新打開PetActivity。我有錯誤在這個動作......(空指針異常)在完成另一個活動時更新活動

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.project/com.example.project.PetActivity}: java.lang.NullPointerException 

PetActivity的onclick代碼:

if (v.getId() == R.id.button1updateAP) { 
     Intent i = new Intent(PetActivity.this, UpdateActivity.class); 
     Bundle ext = getIntent().getExtras(); 
     String idOfPet = ext.getString(IDR);   
     i.putExtra(UpdateActivity.ID, idOfPet);   
     startActivity(i); 
     finish();   
    } 

UpdateActivity的onclick代碼:

if (v.getId() == R.id.button1saveAU) { 
     MyDatabaseHelper db = new MyDatabaseHelper(this); 

     Pet petU = new Pet(); 
     petU.setID(id); 
     petU.setName(TVname.getText().toString());   
     petU.setAge((ETage.getText().toString())); 
     petU.setWeight(ETweight.getText().toString());   
     db.updatePet(petU); 
     db.close(); 

     DatabaseWeight dbw = new DatabaseWeight(this);   
     dbw.addPetWeight(new Pet(petU.getID(), petU.getWeight()));   

     Intent i2 = new Intent(this, PetActivity.class); 
     startActivity(i2); 
     finish(); 
    } 

當我嘗試這樣做,沒關係:

Intent i2 = new Intent(this, ListActiv.class); 
startActivity(i2); 
finish(); 

這段代碼已將我切換到List,並且我可以去刷新PetActivity,但我必須直接進入PetActivity。

我會爲任何建議非常感謝。

謝謝!

+0

你爲什麼不使用startActivityForResult()在PetActivity的onClickmethod。並且不要在A中調用finish() –

+0

,不要完成,在B中不要啓動。在A中,startActivityForResult,在B中,使用setResult。在A,更新根據onActivityResult – njzk2

回答

2

你不需要從PetActivity推出UpdateActivity後調用finish(),和裏面UpdateActivity當你的工作纔剛剛完成完成()之前調用的setResult()...

你的代碼應該是對的onClick MainActivity

if (v.getId() == R.id.button1updateAP) { 
     Intent i = new Intent(PetActivity.this, UpdateActivity.class); 
     Bundle ext = getIntent().getExtras(); 
     String idOfPet = ext.getString(IDR);   
     i.putExtra(UpdateActivity.ID, idOfPet);   
     startActivityForResult(i,some request code);); 
     finish();   
    } 

對於ChildActivity

if (v.getId() == R.id.button1saveAU) { 
     MyDatabaseHelper db = new MyDatabaseHelper(this); 

     Pet petU = new Pet(); 
     petU.setID(id); 
     petU.setName(TVname.getText().toString());   
     petU.setAge((ETage.getText().toString())); 
     petU.setWeight(ETweight.getText().toString());   
     db.updatePet(petU); 
     db.close(); 

     DatabaseWeight dbw = new DatabaseWeight(this);   
     dbw.addPetWeight(new Pet(petU.getID(), petU.getWeight()));   
     if(/*task completed successfully*/){ 
      setResult(RESULT_OK); 
     }else{ 
      setResult(RESULT_CANCELED); 
     } 
     finish(); 
    } 

現在在你的父活動中的onClick你可以檢查裏面這些值

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.i(LOG_TAG, "Inside onActiviy Result : "+resultCode); 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(this, "Update executed successfully..", Toast.LENGTH_SHORT).show(); 
     }else if (resultCode == RESULT_CANCELED) { 
      Toast.makeText(this, "There was an error", Toast.LENGTH_SHORT).show(); 
     } 
    } 

也看到文檔的各種intent標誌..

+0

關閉,但沒有雪茄。 result_canceled通常表示返回,這與自定義錯誤不同。並且你不會處理result_error(它也應該在某處定義)。 – njzk2

+0

僅當您想要處理父活動中的錯誤時才需要。您也可以在「子活動」中處理錯誤。然而,有一個變量來表示你的自定義錯誤也不是一個壞的方法... – aProgrammer

+0

我只是說,你setResult(result_error),但不處理的情況下,你處理後面(result_canceled)就像它是一個錯誤。 – njzk2

相關問題