Kotlin四大組件中的broadcast廣播
在上一章中,有個問題可能大傢都沒有註意,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內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android如何使用ViewPager2實現頁面滑動切換效果
- ViewPager+Fragment實現側滑導航欄
- BroadcastReceiver靜態註冊案例詳解
- Android BottomNavigationView結合ViewPager實現底部導航欄步驟詳解
- Android四大組件之Activity詳細介紹