2010-04-19 48 views
2

我試圖修改記事本教程(Notepadv3解決方案),將NoteEdit類賦予的值存入Notepadv3類。我已經成功地在OnListItemClick方法中使用.putExtra將值放入NoteEdit類中,但我努力爲createNote方法執行此操作;當我嘗試創建新筆記時,我正在接近一個力量。關於使用意圖傳遞數據的問題

我敢打賭有一個簡單的解決方案,但我很新的Java & Android,並非常感謝您的幫助。

這裏是在Notepadv3類問題代碼:

private void createNote() { 
    Intent i = new Intent(this, NoteEdit.class); 
    i.putExtra("key", 1); 
    startActivityForResult(i, ACTIVITY_CREATE); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    Intent i = new Intent(this, NoteEdit.class); 
    i.putExtra(NotesDbAdapter.KEY_ROWID, id); 
    i.putExtra("key", 1); 
    startActivityForResult(i, ACTIVITY_EDIT); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
           Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    fillData(); 
} 

下面是在NoteEdit類接收代碼:

mRowId = savedInstanceState != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWID) 
             : null; 
    if (mRowId == null) { 
     Bundle extras = getIntent().getExtras();    
     mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) 
           : null; 
        value = extras.getInt("key"); 

    } 

我相當確信(mRowId == NULL)當我使用createNote方法時不是這樣,所以getExtras不會被調用。我的一個問題是如何在使用createNote方法時使我的NoteEdit類獲取此值?我對這個新手很抱歉,如果這對你們來說都是一個簡單的問題。

謝謝,

+2

在Eclipse中使用adb logcat,DDMS或DDMS透視圖來查看與「force close」關聯的Java堆棧跟蹤,以查看事件正在炸燬。 – CommonsWare 2010-04-19 13:13:19

+0

是的,我已經看過DDMS角度的logcat,似乎跳出來的是這樣的: 04-19 14:40:05.640:ERROR/AndroidRuntime(18951):未捕獲的句柄:線程主要由於未捕獲的異常而退出 04-19 14:40:05.760:ERROR/AndroidRuntime(18951):java.lang.RuntimeException:無法啓動活動ComponentInfo {com.example.listview/com.example.listview .NoteEdit}:android.database.CursorIndexOutOfBoundsException:索引0請求,大小爲0 所以這是一個遊標問題?我相信這是與(mRowId == null)不成立。有什麼想法嗎? – 2010-04-19 13:43:40

+0

當您的活動通過'startActivity()'(或'startActivityForResult()'啓動時'savedInstanceState'應該爲'null',就像這裏的情況一樣。因此,如果您在調用'createNote()'時認爲'mRowId'是從'savedInstanceState'設置的,那麼就會有某種東西被嚴重混淆。 – CommonsWare 2010-04-19 13:56:24

回答

1

當使用Intent啓動另一個活動,接收活動必須使用getIntent()方法來訪問它;沒有理由爲此使用savedInstanceState;這隻有在「恢復」活動的當前狀態時纔有用,因爲它已被中斷。

您可以在發送活動中使用Intent的「額外」來發送要發送的數據。接收活動使用相同的額外名稱來獲取數據。另外,絕對不要假設所有附加信息都已發送(即檢查null s!)

您應該在接收活動的onCreate方法中做出關於活動的動作的所有決定。

如果一項活動可以通過多種方式「開始」,則必須在Intent中使用Intent.setAction(),並檢查接收活動中的所有有效操作。

此外,不要依賴onListItemClick中的id參數,它通常是不正確的。 position參數始終正確,您可以使用它從適配器中獲取實際項目,並從項目中獲取ID。通常,您可以設置Intent的數據URI,而不是將該ID作爲附加信息發送;這對系統的活動分辨率更好(見下文)。實際上,「數據操作」活動應該支持數據編輯的標準操作,INSERT,EDIT等,並且具有指定這些操作和數據的MIME類型的意圖過濾器。我很確定那些是示例應用程序的一部分。

在接收活動,必須調用Activity.setResult(),而且您通常會通過另一個Intent,然後您可以從發送活動訪問onActivityResult()發回返回的數據(例如新的內容URL)。此外,您必須在適當的時間致電setResult();例如在生命週期退出期間調用它(onPause()onStop())爲時已晚,並且不會將您的結果傳回。

0
if (mRowId == null) { 
    Bundle extras = getIntent().getExtras();    
    mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) 
          : null; 
    if (mRowId == 0) mRowId = null; 

    value = extras.getInt("key"); 

} 

修改這樣的代碼。問題是調用createNote會創建一個mRowId爲空的新音符。但是,由於您傳遞的是「key」參數,所以extras不會爲空,但它們也不會爲KEY_ROWID賦值,getLong()將返回0作爲默認值。稍後在populateFields()中查詢_id = 0時會出現問題