在上一章中,有个问题可能大家都没有注意,Acitivity
在使用startActivityForResult
后,可以给另一个的Acitivity
或者Fragment
进行数据参数的传递,可以回去也可以回来。但如果中间要进行数据的交换,使用startActivityForResult
是不能够做到的。
最常见的一种情况是Acitivity
中启动 碎片Fragmen
的时候,可以通过参数的方式进行传递,但碎片Fragmen
要传回来数据,就没那么容易了。
在Android
中,可以使用 Android
中四大组件之一的Broadcast
,我们叫他广播。这一节的例子就是展示怎么在碎片Fragmen
和Acitivity
中的通讯问题,我们会建立一个Acitivity
和 Fragmen
,在Fragmen
中发送广播,Acitivity
中接受,这样就可以达到双向交流的目的。
创建Fragmen 碎片
建立起Fragmen
碎片,在Fragmen
中发送广播给Acitivity
,让Acitivity
处理相应的广播命令。
fun newInstance(position:Int,image_id:Int,desc:String):BroadcastFragment {
val bundle = Bundle()
bundle.putInt("position",position)
bundle.putInt("image_id",image_id)
bundle.putString("desc",desc)
val fragment = BroadcastFragment()
fragment.arguments = bundle
return fragment
}
在建立Fragmen
的时候,Acitivity
通过参数的形式,把数据传递给Fragmen
,这里就有了一次数据参数的传递过程。
主界面中添加ViewPager
我们建立ViewPager
的目的,是这ViewPager
中添加 Fragmen
,来模拟 Fragmen
和Acitivity
之间的通信问题。
<androidx.viewpager.widget.ViewPager
android:id = "@+id/vp_content"
android:layout_width="match_parent"
android:layout_height="550dp">
<androidx.viewpager.widget.PagerTabStrip
android:id = "@+id/pts_tab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.viewpager.widget.ViewPager>
建立起适配器,来加载Fragmen
碎片。
class BroadcastPagerAdapter(fm:FragmentManager,private val goodsList: MutableList<GoodsInfo>):FragmentStatePagerAdapter(fm) {
override fun getCount(): Int {
return goodsList.size
}
override fun getItem(position: Int): Fragment {
return BroadcastFragment.newInstance(position,goodsList[position].pic,goodsList[position].desc)
}
override fun getPageTitle(position: Int): CharSequence? {
return goodsList[position].name
}
}
在主界面中,加载适配器。
pts_tab.setTextSize(TypedValue.COMPLEX_UNIT_SP,20f)
vp_content.adapter = BroadcastPagerAdapter(supportFragmentManager,GoodsInfo.defaultList)
vp_content.currentItem = 0
到这里,界面该有的控件就建立起来。
创建广播
发送广播和传递数据都是用Intent
,先建立起BroadcastReceiver
,
private var bgChangeReceiver:BgChangeReceiver? = null
private inner class BgChangeReceiver:BroadcastReceiver(){
override fun onReceive(p0: Context?, p1: Intent?) {
}
}
注册广播,
override fun onStart() {
super.onStart()
bgChangeReceiver = BgChangeReceiver()
val filter = IntentFilter(BroadcastFragment.EVENT)
activity?.registerReceiver(bgChangeReceiver,filter)
}
override fun onStop() {
activity?.unregisterReceiver(bgChangeReceiver)
super.onStop()
}
新建一个按钮,来发送广播,
btn_cast.setOnClickListener {
val intent = Intent(BroadcastFragment.EVENT)
intent.putExtra("color",1)
activity?.sendBroadcast(intent)
}
小结
Android
中四大 组件之一的 Broadcast
这里也简单接受了下,如果之前有接触过windows编程的话,你会接触过sendmessage
的函数,其实他就是一种广播,跟Android
一样没有什么两样,都是为了组件和组件,界面和界面直接的沟通。
到此这篇关于Kotlin四大组件中的broadcast广播的文章就介绍到这了,更多相关Kotlin broadcast内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!