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

看板AndroidDev作者時間3年前 (2021/03/20 02:09), 3年前編輯推噓11(11033)
留言44則, 7人參與, 3年前最新討論串1/1
接下來是比較複雜的使用問題(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://www.ptt.cc/bbs/AndroidDev/M.1616177347.A.DBB.html

03/20 17:11, 3年前 , 1F
shared viewmodel
03/20 17:11, 1F
感謝 不過這個和viewmodel不同是新東西啊?

03/20 20:35, 3年前 , 2F
你會有這種問題是對於class和instance觀念不清楚, andr
03/20 20:35, 2F

03/20 20:35, 3年前 , 3F
oid提供的Activity和Fragment都是class,執行時會系統會
03/20 20:35, 3F

03/20 20:35, 3年前 , 4F
製造出Activity和Fragment相對應的instance…然後new I
03/20 20:35, 4F

03/20 20:35, 3年前 , 5F
ntent (activity, Activity.class)這個方式傳遞參數,其
03/20 20:35, 5F

03/20 20:35, 3年前 , 6F
實預設的行為是產生一個Activity的新的instance,將Inte
03/20 20:35, 6F

03/20 20:35, 3年前 , 7F
nt的資料傳給這個新的instance,所以會讓你有錯覺只剩下
03/20 20:35, 7F

03/20 20:35, 3年前 , 8F
最後選擇的的資料…若Fragment的instance,要傳資料給Ac
03/20 20:35, 8F

03/20 20:35, 3年前 , 9F
tivity 的instance,可以透過getActivity()和轉型配合處
03/20 20:35, 9F

03/20 20:35, 3年前 , 10F
理…方法不只一種,但是前置的知識基礎都是要求你能夠理
03/20 20:35, 10F

03/20 20:35, 3年前 , 11F
解class和其instance之間的關係
03/20 20:35, 11F

03/20 20:40, 3年前 , 12F
o種基礎概念如果不清楚,上網找找教學影片仔細看看,解釋
03/20 20:40, 12F

03/20 20:40, 3年前 , 13F
起來要敲很多文字配合圖片才能有一個模糊的輪廓
03/20 20:40, 13F
感謝。 class還稍微了解,但instance這個我真的不太了解,和Java的實作好像又不一樣 嗯,所以我應該去從Java書中找嗎? 請問如果要找教學影片的話,class and instance這個就是關鍵字嗎?

03/22 01:05, 3年前 , 14F
class→類別, instance→實體, 都是物件導向語言的基本觀念
03/22 01:05, 14F

03/22 01:06, 3年前 , 15F
這個觀念你去找任何一本講 Java 的書幾乎都會談
03/22 01:06, 15F

03/22 01:14, 3年前 , 16F
本版老ID了其實
03/22 01:14, 16F

03/22 10:39, 3年前 , 17F
button跟buttonsheet不是都在同個fragment? 不需要用intent吧
03/22 10:39, 17F

03/22 19:10, 3年前 , 18F
如果是BottomSheetDialogFragment的話那就是另一個獨
03/22 19:10, 18F

03/22 19:10, 3年前 , 19F
立的Fragment了
03/22 19:10, 19F
我看了一下自己的java入門書 好像只有提到方法的instance,它沒有說和Activity、Fragment的關係 雖然努力看著教學範例做,但好像做出來是一知半解 我也有一本Android書&到圖書館借書,但剛好都沒有我所需要的知識 不知道有沒有推薦能詳細說明及範例的Android書啊?

03/24 01:25, 3年前 , 20F
我是上一學期的課後自學的耶哈哈哈,然後現在用的方
03/24 01:25, 20F

03/24 01:25, 3年前 , 21F
法很亂老師說根本亂搞哈哈哈。前幾篇有位資深的大大
03/24 01:25, 21F

03/24 01:25, 3年前 , 22F
有出書喔,你要不要買那本看看?哪位大大資歷有十年
03/24 01:25, 22F

03/24 01:25, 3年前 , 23F
了超猛
03/24 01:25, 23F

03/24 01:27, 3年前 , 24F
03/24 01:27, 24F
其實我也有看到這本書 只是我java其實並沒有學很深,而Kotlin更是沒用過 不知道自己的程度看不看得懂 但我會考慮購入,感謝推薦!

03/24 20:25, 3年前 , 25F
我也是純java目前,Java底子也不好所以學得頗累,到
03/24 20:25, 25F

03/24 20:25, 3年前 , 26F
目前的心得感覺是用Android練Java哈哈
03/24 20:25, 26F
不過其實越用後,有些地方又會回去看java書的基礎在自己試著執行一次 如果是那本書,不知道裡面有沒有說明我現在的問題?

03/25 02:15, 3年前 , 27F
你的流程是在同個 activity 內溝通,不需要 intent。
03/25 02:15, 27F

03/25 02:16, 3年前 , 28F
把 intent 拿掉後可以避免二樓 K 大提到的問題。
03/25 02:16, 28F

03/25 02:18, 3年前 , 29F
然後我覺得.. 你可以先鎖定一個已知的方法,
03/25 02:18, 29F

03/25 02:18, 3年前 , 30F
例如文章內你提到單例,單例肯定能解決這問題的,
03/25 02:18, 30F

03/25 02:20, 3年前 , 31F
就用單例 + listener 來完成跨 fragment 的溝通吧!
03/25 02:20, 31F

03/25 02:21, 3年前 , 32F
等到單例成功後,再來研究更複雜的 ViewModel 即可。
03/25 02:21, 32F
感謝。 您是說單例的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

03/25 17:59, 3年前 , 33F
listener 泛指一種監聽資料變化或事件的實作模式,
03/25 17:59, 33F

03/25 18:00, 3年前 , 34F
搜尋 java listener 即可找到許多解說及範例。
03/25 18:00, 34F

03/25 18:12, 3年前 , 35F
以下試著說明在你的問題中,各元件的角色及溝通流程。
03/25 18:12, 35F

03/25 18:12, 3年前 , 36F
首先 fragment 及 bottom sheet 都可以呼叫單例的
03/25 18:12, 36F

03/25 18:13, 3年前 , 37F
getInstance() 取得"同一個"單例的實體。
03/25 18:13, 37F

03/25 18:13, 3年前 , 38F
當 bottom sheet 按完選項後,可呼叫單例的 setData ()
03/25 18:13, 38F

03/25 18:14, 3年前 , 39F
之類的方法將資料傳入。
03/25 18:14, 39F

03/25 18:14, 3年前 , 40F
而 fragment 則是 listener,負責監聽單例的資料變化。
03/25 18:14, 40F

03/25 18:16, 3年前 , 41F
當單例的 data 被改變時,將呼叫 listener 上的方法,
03/25 18:16, 41F

03/25 18:16, 3年前 , 42F
例如 onDataChanged(),來通知 fragment 資料改變了,
03/25 18:16, 42F

03/25 18:17, 3年前 , 43F
這時 fragment 就能取得新資料來改變畫面上的文字了。
03/25 18:17, 43F

03/25 18:27, 3年前 , 44F
※最後補充,bottom sheet 可呼叫 dismiss() 來關閉。
03/25 18:27, 44F
我大概知道您的意思了,只是目前我要再多想想要怎麼寫 才能把監聽單例的資料、onDataChanged()及畫面做結合 感謝! ※ 編輯: MAXQb (111.243.0.112 臺灣), 03/25/2021 23:32:11
文章代碼(AID): #1WLEZ3sx (AndroidDev)
文章代碼(AID): #1WLEZ3sx (AndroidDev)