2012-02-16 17 views
1

Androidには少し新しく、初めてのプロダクションアプリを開発しようとしています。これは、ユーザが定義したデータストレージアプリであり、リストアクティビティと追加ダイアログアクティビティ、およびdbアダプタで構成されています。すべての私の "CRUD"(作成、読み取り、更新、削除)機能は完全に機能しているようです。しかし、データがdbに保存されていないときに、追加ダイアログの向きを変更すると、次のエラーに遭遇しています。言い換えれば、私のonSavedInstanceState()関数は、私がポートレートから風景に、またはその逆に向きを変えると失敗しています。アクティビティでNullPointerExceptionが発生しました

02-16 11:42:05.321:E/AndroidRuntime(347):java.lang.RuntimeException:アクティビティを一時停止できません(net.learn2develop.Homework/net.learn2develop.Homework.HomeworkEditActivity):java.lang。 NullPointerExceptionが

ここでは私のコードです:

public class HomeworkEditActivity extends Activity{ 
      private Long mRowId; 

     // SQLite Db Helper 
      private HomeworkDbAdapter mDbHelper ; 




// declarations for SQLitedatabase actions 
private EditText mSubject; 
private EditText mDueText; 
private EditText mDescText; 



private Button btnSave = null; 

/** 
* Called when the activity 
* is first created 
*/ 
@Override 
protected void onCreate(Bundle savedInstanceState){ 

    // called to display the reminder edit class 
    super.onCreate(savedInstanceState); 

    // open the database 
    mDbHelper = new HomeworkDbAdapter(this); 

    // set the content view by the xml layout 
    setContentView(R.layout.homeworkedit); 


    // initialize the save button 
    btnSave  = (Button) findViewById(R.id.btnSave); 

    // initiate the edit text fields 
    mSubject = (EditText) findViewById(R.id.txtSubject); 
    mDueText = (EditText) findViewById(R.id.txtDueDate); 
    mDescText = (EditText) findViewById(R.id.txtDesc); 


    mRowId = savedInstanceState != null 
     ? savedInstanceState.getLong(HomeworkDbAdapter.KEY_ROWID) 
     : null; 

    // register listeners and set the text of the buttons to their default 
    registerButtonListenersAndSetDefaultText(); 

} 
private void setRowIdFromIntent(){ 
    if(mRowId == null){ 
     Bundle extras = getIntent().getExtras(); 
     mRowId = extras != null 
     ? extras.getLong(HomeworkDbAdapter.KEY_ROWID) 
     : null; 
    } 
} 
@Override 
protected void onPause(){ 

    mDbHelper.close(); 
    super.onPause(); 
} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    mDbHelper.open(); 
    setRowIdFromIntent(); 

     populateFields(); 

} 

private void registerButtonListenersAndSetDefaultText() { 
    btnSave.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick (View v){ 
      mSubject.getText(); 
      mDescText.getText(); 
      mDueText.getText(); 

      saveState(); 
      setResult(RESULT_OK); 
      Toast.makeText(HomeworkEditActivity.this, 
        getString(R.string.task_saved_message), 
        Toast.LENGTH_SHORT).show(); 
      finish();            // return to list activity 
     } 



      }); 

} 

private void populateFields() { 
    if(mRowId != null){ 
     Cursor reminder = mDbHelper.fetchHomework(mRowId); 
      startManagingCursor(reminder); 
      mSubject.setText(reminder.getString(
         reminder.getColumnIndexOrThrow(HomeworkDbAdapter.KEY_SUBJECT))); 
      mDueText.setText(reminder.getString(
        reminder.getColumnIndexOrThrow(HomeworkDbAdapter.KEY_DUE))); 
      mDescText.setText(reminder.getString(
        reminder.getColumnIndexOrThrow(HomeworkDbAdapter.KEY_DESC))); 
    } 
    if(mRowId == null){ 
     onCreate(null); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState){ 

    try{ 
    outState.putLong(HomeworkDbAdapter.KEY_ROWID, mRowId); 
    }catch(NullPointerException npe){ 
     npe.printStackTrace(); 
    } 
    super.onSaveInstanceState(outState); 
} 



private void saveState() { 
    // add the save of the text reference here 
    String subject = mSubject.getText().toString(); 
    String due_date = mDueText.getText().toString(); 
    String desc = mDescText.getText().toString(); 



    if(mRowId == null){ 
     long id = mDbHelper.createHomework(subject, due_date, desc); 
     if(id > 0){ 
      mRowId = id; 
     } 
    }else{ 
     mDbHelper.updateHomework(mRowId, subject, due_date, desc); 
    } 
} 

}

+1

あなたは完全なlogcatをしてください送信することができますか? – ademar111190

答えて

1

NullPointerExceptionメッセージは「活動を一時停止することができません」が含まれているという事実は問題があなたのonPause(..)オーバーライドであることを意味します。私はこれがmDbHelperがnullのときに起こると仮定しますが、あなたのコードを見ても、なぜそうなるのかわかりません。そのよう

0

(mDbHelper.closeを切り替えてみてください)とsuper.onPause()

:あなたが最初super.onPause()メソッドを呼び出す必要があり、時間の

@Override 
protected void onPause(){ 
    super.onPause(); 
    mDbHelper.close(); 
} 

99%。 super.onPause()を呼び出すと、舞台裏で多くのことが起こります。私は実際にはスーパーメソッド呼び出しを完全に削除する必要があった稀な機会がありました。これはそれらの1つのように見えません。

は、詳細についてはこちらをご覧ください:

http://developer.android.com/training/basics/activity-lifecycle/pausing.html#Pause