作者MAXQb ()
看板AndroidDev
標題[問題]為何BottomSheet和Fragment之間傳資料??
時間Sat Mar 20 02:09:02 2021
接下來是比較複雜的使用問題(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呈現的選擇結果資料都能維持在畫面上
---------------------------------------------------------
問題是:
當我想把BottomSheet的選擇結果傳回到Fragment裡的Button1呈現出來
Intent卻是要這樣寫,Intent intent=new Intent(getActivity(),Activity.class);
資料才傳的過去
而不是Intent intent=new Intent(getActivity(),Fragment.class);
而且用getInstance()單例也沒辦法在兩個Fragment間set、get資料結果
這也因此沒辦法用ViewModel來維持選擇結果在畫面上,只要下一個按鈕選擇完後,畫面
整體就會更新
ex:Button2選擇完後,本來顯示在Button1的結果還是會消失,只留下Button2的選擇結果
為何BottomSheet和Fragment之間的關係會是這樣呢?
請問正確寫法or更好的寫法,該怎麼寫才對?
有沒有最簡單的範例可看啊?
謝謝各位的解答了。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.8.190 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/AndroidDev/M.1616177347.A.DBB.html
1F:推 corkcork: shared viewmodel 03/20 17:11
感謝
不過這個和viewmodel不同是新東西啊?
2F:→ ketrobo: 你會有這種問題是對於class和instance觀念不清楚, andr 03/20 20:35
3F:→ ketrobo: oid提供的Activity和Fragment都是class,執行時會系統會 03/20 20:35
4F:→ ketrobo: 製造出Activity和Fragment相對應的instance…然後new I 03/20 20:35
5F:→ ketrobo: ntent (activity, Activity.class)這個方式傳遞參數,其 03/20 20:35
6F:→ ketrobo: 實預設的行為是產生一個Activity的新的instance,將Inte 03/20 20:35
7F:→ ketrobo: nt的資料傳給這個新的instance,所以會讓你有錯覺只剩下 03/20 20:35
8F:→ ketrobo: 最後選擇的的資料…若Fragment的instance,要傳資料給Ac 03/20 20:35
9F:→ ketrobo: tivity 的instance,可以透過getActivity()和轉型配合處 03/20 20:35
10F:→ ketrobo: 理…方法不只一種,但是前置的知識基礎都是要求你能夠理 03/20 20:35
11F:→ ketrobo: 解class和其instance之間的關係 03/20 20:35
12F:推 ketrobo: o種基礎概念如果不清楚,上網找找教學影片仔細看看,解釋 03/20 20:40
13F:→ ketrobo: 起來要敲很多文字配合圖片才能有一個模糊的輪廓 03/20 20:40
感謝。
class還稍微了解,但instance這個我真的不太了解,和Java的實作好像又不一樣
嗯,所以我應該去從Java書中找嗎?
請問如果要找教學影片的話,class and instance這個就是關鍵字嗎?
14F:推 LPH66: class→類別, instance→實體, 都是物件導向語言的基本觀念 03/22 01:05
15F:→ LPH66: 這個觀念你去找任何一本講 Java 的書幾乎都會談 03/22 01:06
16F:→ kobe8112: 本版老ID了其實 03/22 01:14
17F:→ LZN: button跟buttonsheet不是都在同個fragment? 不需要用intent吧 03/22 10:39
18F:推 ohmylove347: 如果是BottomSheetDialogFragment的話那就是另一個獨 03/22 19:10
19F:→ ohmylove347: 立的Fragment了 03/22 19:10
我看了一下自己的java入門書
好像只有提到方法的instance,它沒有說和Activity、Fragment的關係
雖然努力看著教學範例做,但好像做出來是一知半解
我也有一本Android書&到圖書館借書,但剛好都沒有我所需要的知識
不知道有沒有推薦能詳細說明及範例的Android書啊?
20F:推 ohmylove347: 我是上一學期的課後自學的耶哈哈哈,然後現在用的方 03/24 01:25
21F:→ ohmylove347: 法很亂老師說根本亂搞哈哈哈。前幾篇有位資深的大大 03/24 01:25
22F:→ ohmylove347: 有出書喔,你要不要買那本看看?哪位大大資歷有十年 03/24 01:25
23F:→ ohmylove347: 了超猛 03/24 01:25
其實我也有看到這本書
只是我java其實並沒有學很深,而Kotlin更是沒用過
不知道自己的程度看不看得懂
但我會考慮購入,感謝推薦!
25F:推 ohmylove347: 我也是純java目前,Java底子也不好所以學得頗累,到 03/24 20:25
26F:→ ohmylove347: 目前的心得感覺是用Android練Java哈哈 03/24 20:25
不過其實越用後,有些地方又會回去看java書的基礎在自己試著執行一次
如果是那本書,不知道裡面有沒有說明我現在的問題?
27F:推 pinefruit: 你的流程是在同個 activity 內溝通,不需要 intent。 03/25 02:15
28F:→ pinefruit: 把 intent 拿掉後可以避免二樓 K 大提到的問題。 03/25 02:16
29F:推 pinefruit: 然後我覺得.. 你可以先鎖定一個已知的方法, 03/25 02:18
30F:→ pinefruit: 例如文章內你提到單例,單例肯定能解決這問題的, 03/25 02:18
31F:→ pinefruit: 就用單例 + listener 來完成跨 fragment 的溝通吧! 03/25 02:20
32F:→ pinefruit: 等到單例成功後,再來研究更複雜的 ViewModel 即可。 03/25 02:21
感謝。
您是說單例的getInstance傳遞資料嗎?
那它的getter和setter各該放在哪個地方呢?(activity、Fragment、bottom sheet?)
我有試了一下,只有第一次資料有傳過去,第二次後的資料結果還是都停在第一次
而您說的listener是指Button的的OnClick listener這個嗎?
我是把OnClick用Switch來分別處理按鈕按下時的動作
問題是最後Button裡的文字沒辦法變化,另外Bottom sheet沒辦法在按下按鈕後消失
※ 編輯: MAXQb (111.243.0.112 臺灣), 03/25/2021 16:34:38
33F:推 pinefruit: listener 泛指一種監聽資料變化或事件的實作模式, 03/25 17:59
34F:→ pinefruit: 搜尋 java listener 即可找到許多解說及範例。 03/25 18:00
35F:推 pinefruit: 以下試著說明在你的問題中,各元件的角色及溝通流程。 03/25 18:12
36F:→ pinefruit: 首先 fragment 及 bottom sheet 都可以呼叫單例的 03/25 18:12
37F:→ pinefruit: getInstance() 取得"同一個"單例的實體。 03/25 18:13
38F:→ pinefruit: 當 bottom sheet 按完選項後,可呼叫單例的 setData () 03/25 18:13
39F:→ pinefruit: 之類的方法將資料傳入。 03/25 18:14
40F:→ pinefruit: 而 fragment 則是 listener,負責監聽單例的資料變化。 03/25 18:14
41F:→ pinefruit: 當單例的 data 被改變時,將呼叫 listener 上的方法, 03/25 18:16
42F:→ pinefruit: 例如 onDataChanged(),來通知 fragment 資料改變了, 03/25 18:16
43F:→ pinefruit: 這時 fragment 就能取得新資料來改變畫面上的文字了。 03/25 18:17
44F:→ pinefruit: ※最後補充,bottom sheet 可呼叫 dismiss() 來關閉。 03/25 18:27
我大概知道您的意思了,只是目前我要再多想想要怎麼寫
才能把監聽單例的資料、onDataChanged()及畫面做結合
感謝!
※ 編輯: MAXQb (111.243.0.112 臺灣), 03/25/2021 23:32:11