Fragment和Activity通信
1. Fragment->Activity
- 可以在fragment编写interface接口,实例化mListener字段(初始化设置为null)、在Activity实现回调接口,在Fragment调用onAttach的时候实现,实例化mListener字段,实现调用。
- 参考文章:https://blog.csdn.net/weixin_34273481/article/details/85815511
- 参考书籍:Android高级编程第四版P57
- 参考书籍:第一行代码第二版P151
- demo:https://gitee.com/junwuming/android/tree/master/Project/FragmentListener
- 在Activity里面通过Activity的FragmentManager实例通过findViewById or findFragmentByTag得到Fragment实例
- 在Freeagment里面通过getActivity() 获取Activity实例
参考demo:https://gitee.com/junwuming/android/tree/master/Project/FragmentListener
class MainActivity : AppCompatActivity(), BlankFragment.OnInteractionClick {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
/** 获取碎片实例*/
private val fragmentManager = supportFragmentManager
val blankFragment = fragmentManager.findFragmentById(R.id.blank)
override fun onButton(a: String) {
Log.d(TAG, "onButton: $a")
}
companion object {
private const val TAG = "MainActivity"
}
}
class BlankFragment : Fragment() {
/** 方式1 : 使用回调实现和ACTIVITY之间的通信*/
interface OnInteractionClick {
fun onButton(a: String)
}
private var mListener: OnInteractionClick? = null
private var activity: Activity? = null
override fun onAttach(context: Context) {
super.onAttach(context)
/** 绑定回调 */
if (context is OnInteractionClick) {
mListener = context
}
/** 获取Activity实例 */
activity = getActivity() as Activity
}
override fun onDetach() {
super.onDetach()
mListener = null
}
private fun onInteraction(a: String) {
mListener?.onButton(a)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
onInteraction("Fragment onCreate")
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
onInteraction("Fragment onCreateView")
return inflater.inflate(R.layout.fragment_blank, container, false)
}
}