[問題]為何BottomSheet和Fragment之間傳資料??

作者: MAXQb   2021-03-20 02:09:02
接下來是比較複雜的使用問題(Java寫法)。
如圖所示:
https://i.imgur.com/jKs2g5t.png
首先
1.有1個Activity
2.Activity裡有3個能滑動換頁面的Fragment(Viewpager2)及TabLayout
3.Fragment裡有N個Button,ex:Button1、Button2等
4.按下Button後畫面底部會出現bottom_sheet出來
5.bottom_sheet裡面預計有Button、ImageButton、SeekBar等項目
6.項目選擇完後,資料會傳回Button1那呈現選擇結果
之後重複3.~6.直到選擇完
這期間Button1、Button2呈現的選擇結果資料都能維持在畫面上
作者: corkcork (thaibar)   2021-03-20 17:11:00
shared viewmodel
作者: ketrobo (貓蘿蔔)   2021-03-20 20:35:00
你會有這種問題是對於class和instance觀念不清楚, android提供的Activity和Fragment都是class,執行時會系統會製造出Activity和Fragment相對應的instance…然後new Intent (activity, Activity.class)這個方式傳遞參數,其實預設的行為是產生一個Activity的新的instance,將Intent的資料傳給這個新的instance,所以會讓你有錯覺只剩下最後選擇的的資料…若Fragment的instance,要傳資料給Activity 的instance,可以透過getActivity()和轉型配合處理…方法不只一種,但是前置的知識基礎都是要求你能夠理解class和其instance之間的關係o種基礎概念如果不清楚,上網找找教學影片仔細看看,解釋起來要敲很多文字配合圖片才能有一個模糊的輪廓
作者: LPH66 (-6.2598534e+18f)   2021-03-22 01:05:00
class→類別, instance→實體, 都是物件導向語言的基本觀念這個觀念你去找任何一本講 Java 的書幾乎都會談
作者: kobe8112 (小B)   2021-03-22 01:14:00
本版老ID了其實
作者: LZN (秋)   2021-03-22 10:39:00
button跟buttonsheet不是都在同個fragment? 不需要用intent吧
作者: ohmylove347 (米特巴爾)   2021-03-22 19:10:00
如果是BottomSheetDialogFragment的話那就是另一個獨立的Fragment了
作者: pinefruit (莫使惹塵埃)   2021-03-25 02:15:00
你的流程是在同個 activity 內溝通,不需要 intent。把 intent 拿掉後可以避免二樓 K 大提到的問題。然後我覺得.. 你可以先鎖定一個已知的方法,例如文章內你提到單例,單例肯定能解決這問題的,就用單例 + listener 來完成跨 fragment 的溝通吧!等到單例成功後,再來研究更複雜的 ViewModel 即可。listener 泛指一種監聽資料變化或事件的實作模式,搜尋 java listener 即可找到許多解說及範例。以下試著說明在你的問題中,各元件的角色及溝通流程。首先 fragment 及 bottom sheet 都可以呼叫單例的getInstance() 取得"同一個"單例的實體。當 bottom sheet 按完選項後,可呼叫單例的 setData ()之類的方法將資料傳入。而 fragment 則是 listener,負責監聽單例的資料變化。當單例的 data 被改變時,將呼叫 listener 上的方法,例如 onDataChanged(),來通知 fragment 資料改變了,這時 fragment 就能取得新資料來改變畫面上的文字了。

Links booklink

Contact Us: admin [ a t ] ucptt.com