作者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/cn.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