DialogFragment对话框(二) ——Fragment和Activity的通信

来源:互联网 发布:mac cd 到u盘 编辑:程序博客网 时间:2024/05/29 14:55

DialogFragment对话框(二) ——Fragment和Activity的通信

标签(空格分隔): fragment 通信 dialog android
作者:陈小默


紧接着上一节,DialogFragment对话框(一) ——创建对话框,这里通过在DialogFragment对话框回传EditText中的数据来介绍几种Fragment和Activity之间通信的方法

  • DialogFragment对话框二 Fragment和Activity的通信
    • 接口回调
    • EventBus

准备工作,修改上一节中的布局文件,将TextView换成EditText
dialog_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <EditText        android:id="@+id/message"        android:layout_width="300dp"        android:layout_height="wrap_content" />    <Button        android:id="@+id/ok"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="确定" /></LinearLayout>

接口回调

最古老也是最原始的通信方式
定义一个作为回调的接口
Callback.kt

interface Callback {    fun response(message:String)}

在Activity中传递回调接口参数

    private fun showViewDialog() {        var dialog: MyViewDialogFragment = MyViewDialogFragment()        var bundle = Bundle()        bundle.putSerializable("callback", object : Callback {            override fun response(message: String) {                Toast.makeText(this@ShowActivity, message, Toast.LENGTH_SHORT).show()            }        })        dialog.arguments=bundle        dialog.show(fragmentManager, "tag")    }

在Fragment中接收参数

class MyViewDialogFragment : DialogFragment() {    private var callback: Callback? = null    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)//设置窗体为无标题        callback = arguments["callback"] as Callback//获得Activity传来的回调接口        var view: View = inflater.inflate(R.layout.dialog_view, container, false)        initView(view)        return view    }    override fun show(manager: FragmentManager?, tag: String?) {        super.show(manager, tag)    }    private fun initView(view: View) {        var message = view.findViewById(R.id.message) as EditText        var button = view.findViewById(R.id.ok) as Button        button.setOnClickListener { view ->            callback?.response(message.text.toString())            dismiss()        }    }}

这时候再运行,我们就能看到Activity中吐司的对话框中输入的文字了

EventBus

使用EventBus传递数据应该是最简便的方法了
修改Activity的代码

class ShowActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_show)        findViewById(R.id.alertDialog).setOnClickListener { view -> showAlertDialog() }        findViewById(R.id.viewDialog).setOnClickListener { view -> showViewDialog() }        EventBus.getDefault().register(this)    }    private fun showAlertDialog() {        var dialog: MyAlertDialogFragment = MyAlertDialogFragment()        dialog.ctx = this        dialog.show(fragmentManager, "tag")    }    private fun showViewDialog() {        var dialog: MyViewDialogFragment = MyViewDialogFragment()        dialog.show(fragmentManager, "tag")    }    @Subscribe open fun response(message:String){        Toast.makeText(this@ShowActivity, message, Toast.LENGTH_SHORT).show()    }    override fun onDestroy() {        EventBus.getDefault().unregister(this)        super.onDestroy()    }}

修改Fragment的代码

class MyViewDialogFragment : DialogFragment() {    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)//设置窗体为无标题        var view: View = inflater.inflate(R.layout.dialog_view, container, false)        initView(view)        return view    }    override fun show(manager: FragmentManager?, tag: String?) {        super.show(manager, tag)    }    private fun initView(view: View) {        var message = view.findViewById(R.id.message) as EditText        var button = view.findViewById(R.id.ok) as Button        button.setOnClickListener { view ->            EventBus.getDefault().post(message.text.toString())            dismiss()        }    }}
0 0
原创粉丝点击