看板 AndroidDev 關於我們 聯絡資訊
接下來是比較複雜的使用問題(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
corkcork: shared viewmodel 03/20 17:11
感謝 不過這個和viewmodel不同是新東西啊?
ketrobo: 你會有這種問題是對於class和instance觀念不清楚, andr 03/20 20:35
ketrobo: oid提供的Activity和Fragment都是class,執行時會系統會 03/20 20:35
ketrobo: 製造出Activity和Fragment相對應的instance…然後new I 03/20 20:35
ketrobo: ntent (activity, Activity.class)這個方式傳遞參數,其 03/20 20:35
ketrobo: 實預設的行為是產生一個Activity的新的instance,將Inte 03/20 20:35
ketrobo: nt的資料傳給這個新的instance,所以會讓你有錯覺只剩下 03/20 20:35
ketrobo: 最後選擇的的資料…若Fragment的instance,要傳資料給Ac 03/20 20:35
ketrobo: tivity 的instance,可以透過getActivity()和轉型配合處 03/20 20:35
ketrobo: 理…方法不只一種,但是前置的知識基礎都是要求你能夠理 03/20 20:35
ketrobo: 解class和其instance之間的關係 03/20 20:35
ketrobo: o種基礎概念如果不清楚,上網找找教學影片仔細看看,解釋 03/20 20:40
ketrobo: 起來要敲很多文字配合圖片才能有一個模糊的輪廓 03/20 20:40
感謝。 class還稍微了解,但instance這個我真的不太了解,和Java的實作好像又不一樣 嗯,所以我應該去從Java書中找嗎? 請問如果要找教學影片的話,class and instance這個就是關鍵字嗎?
LPH66: class→類別, instance→實體, 都是物件導向語言的基本觀念 03/22 01:05
LPH66: 這個觀念你去找任何一本講 Java 的書幾乎都會談 03/22 01:06
kobe8112: 本版老ID了其實 03/22 01:14
LZN: button跟buttonsheet不是都在同個fragment? 不需要用intent吧 03/22 10:39
ohmylove347: 如果是BottomSheetDialogFragment的話那就是另一個獨 03/22 19:10
ohmylove347: 立的Fragment了 03/22 19:10
我看了一下自己的java入門書 好像只有提到方法的instance,它沒有說和Activity、Fragment的關係 雖然努力看著教學範例做,但好像做出來是一知半解 我也有一本Android書&到圖書館借書,但剛好都沒有我所需要的知識 不知道有沒有推薦能詳細說明及範例的Android書啊?
ohmylove347: 我是上一學期的課後自學的耶哈哈哈,然後現在用的方 03/24 01:25
ohmylove347: 法很亂老師說根本亂搞哈哈哈。前幾篇有位資深的大大 03/24 01:25
ohmylove347: 有出書喔,你要不要買那本看看?哪位大大資歷有十年 03/24 01:25
ohmylove347: 了超猛 03/24 01:25
ohmylove347: #1WHt3FEl 03/24 01:27
其實我也有看到這本書 只是我java其實並沒有學很深,而Kotlin更是沒用過 不知道自己的程度看不看得懂 但我會考慮購入,感謝推薦!
ohmylove347: 我也是純java目前,Java底子也不好所以學得頗累,到 03/24 20:25
ohmylove347: 目前的心得感覺是用Android練Java哈哈 03/24 20:25
不過其實越用後,有些地方又會回去看java書的基礎在自己試著執行一次 如果是那本書,不知道裡面有沒有說明我現在的問題?
pinefruit: 你的流程是在同個 activity 內溝通,不需要 intent。 03/25 02:15
pinefruit: 把 intent 拿掉後可以避免二樓 K 大提到的問題。 03/25 02:16
pinefruit: 然後我覺得.. 你可以先鎖定一個已知的方法, 03/25 02:18
pinefruit: 例如文章內你提到單例,單例肯定能解決這問題的, 03/25 02:18
pinefruit: 就用單例 + listener 來完成跨 fragment 的溝通吧! 03/25 02:20
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
pinefruit: listener 泛指一種監聽資料變化或事件的實作模式, 03/25 17:59
pinefruit: 搜尋 java listener 即可找到許多解說及範例。 03/25 18:00
pinefruit: 以下試著說明在你的問題中,各元件的角色及溝通流程。 03/25 18:12
pinefruit: 首先 fragment 及 bottom sheet 都可以呼叫單例的 03/25 18:12
pinefruit: getInstance() 取得"同一個"單例的實體。 03/25 18:13
pinefruit: 當 bottom sheet 按完選項後,可呼叫單例的 setData () 03/25 18:13
pinefruit: 之類的方法將資料傳入。 03/25 18:14
pinefruit: 而 fragment 則是 listener,負責監聽單例的資料變化。 03/25 18:14
pinefruit: 當單例的 data 被改變時,將呼叫 listener 上的方法, 03/25 18:16
pinefruit: 例如 onDataChanged(),來通知 fragment 資料改變了, 03/25 18:16
pinefruit: 這時 fragment 就能取得新資料來改變畫面上的文字了。 03/25 18:17
pinefruit: ※最後補充,bottom sheet 可呼叫 dismiss() 來關閉。 03/25 18:27
我大概知道您的意思了,只是目前我要再多想想要怎麼寫 才能把監聽單例的資料、onDataChanged()及畫面做結合 感謝! ※ 編輯: MAXQb (111.243.0.112 臺灣), 03/25/2021 23:32:11