iT邦幫忙

0

Android Studio Fragment 以Bundle 傳值到 Activity 出錯

  • 分享至 

  • xImage

想問各位高手,我想將登入的資訊以Bundle 的方式打包從Fragment傳送到Activity個人檔案裡頭,並且顯示資訊出來以便日後可以更改

以下是我的Fragment介面
https://ithelp.ithome.com.tw/upload/images/20220828/20138362Qf0WpgFS14.png
以下是我的Activity介面
https://ithelp.ithome.com.tw/upload/images/20220828/20138362b9uHPv6kO2.png
最後確實都有顯現出來資訊也可以修改,但是出現java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 傳送空值的錯誤
https://ithelp.ithome.com.tw/upload/images/20220828/20138362txSCJ3K1cl.png

想請問大家是哪個環節出錯了?

看更多先前的討論...收起先前的討論...
為什麼你需要startActivity兩次?(LoginTabFrag - line: 65, 68)
我不確定舊intent是否會被新intent覆蓋。
你好,謝謝你的回覆,我剛剛發現好像是因為我打兩次 startActivity才會有空值的問題,但是因為我想要登入之後直接到主頁(LoginTabFrag - line: 68),而不是個人資訊那一頁(LoginTabFrag - line: 65)
你必須一步一步來
Fragment傳遞Intent到Activity A(個人資訊),
再從Activity A(個人資訊)開始Activity B(主頁)
好的我了解了,謝謝你!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-08-29 10:13:55

Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference

就錯誤訊息來看
就是 intent 裡的 bundle 是 null
以致對他 getString 導致錯誤

看更多先前的回應...收起先前的回應...

感謝你的回覆,我已除錯成功了!我將bundle去除掉就可以了
以下是登入介面
https://ithelp.ithome.com.tw/upload/images/20220829/20138362AahVYm0yWX.png
以下是個人檔案介面
https://ithelp.ithome.com.tw/upload/images/20220829/20138362ReK1URaw4B.png
顯示出來資料了!
https://ithelp.ithome.com.tw/upload/images/20220829/20138362QveEjtT18D.png

但我有一個問題想再請教一下,我點進入主頁按鈕,之後再點個人檔案頁面資料就不見了!
想請問該如何點回之後資料依舊存在呢?

以下是個人檔案介面(UserProfile)
https://ithelp.ithome.com.tw/upload/images/20220829/20138362mCpVwaU9zw.png

以下是主頁面(MainActivity)
https://ithelp.ithome.com.tw/upload/images/20220829/20138362pCk8URm5IM.png
以下是點進入主頁後再點進個人檔案料消失顯示畫面
https://ithelp.ithome.com.tw/upload/images/20220829/20138362W0PstyqLPY.png

這是因為您在沒有將data通過intent傳遞給UserProfile.java

Activity stack(堆棧)

  1. Activity contains [LoginFrag]
  2. == Intent(username, email, password) ==>
  3. Activity A [UserProfile]
  4. == Intent(empty) ==>
  5. Activity B [MainActvitiy]
  6. == Intent(empty) ==>
  7. Activity C [UserProfile] (MainActivity Line: 72)

有兩種方法可以解決這個問題。

一種方法是將data放入Singleton(單例模式) object中,這樣您就不需要依賴意intent來傳遞data。

另一種方法是修改AndroidManifest.xml。
android:launchMode="singleTask"添加到activity中,這樣您的目標activity將始終只有單個instance。

E.G.
Activity stack(堆棧)
Activity contains [LoginFrag]
== Intent(username, email, password) ==>
Activity A [UserProfile]
== Intent(empty) ==>
Activity B [MainActvitiy]
== Intent(Empty) ==>
Activity A [UserProfile]

想請問該如何點回之後資料依舊存在呢?

比起這個問題
更重要的是基本觀念
這觀念適用在「你寫的所有頁面」

任何一個頁面,顯示的資料,可能有四個來源
1.使用者按鍵盤輸入的
2.程式寫固定的
3.從資料庫取出來的
4.從前一個頁面傳過來的

先確定你這個頁面顯示的「來源」是那一種
如果是第4種
就是樓上講的「沒有傳 bundle 過來」

這屬於數據持久化(data persistent)問題

要解決,要麼

  1. 每次都通過intent傳遞data
  2. 將data放入single instance object
  3. 將Activity變成single instance object

我要發表回答

立即登入回答