Android学习笔记16

因为如果把dialog写在viewmodel里面,之後在自动化测试的时候可能会出问题,所以在mvvm架构底下,我们另外写了一个dialogviewmodel,对应到dialog的view
首先先建立一个dialogviewmodel
class DialogViewModel: ViewModel() {
val result: MutableLiveData = MutableLiveData()
}
然後建立一个状态资讯
//表达一个元件的状态
//sealed可以使用dataclass传值
sealed class MainDialogResult {
data class Ok(val message: String): MainDialogResult()
object Cancel: MainDialogResult()
//也可以使用object变成跟enum一样的用法
}
然後在dialogfragment中这样调用

class FragmentDialog: DialogFragment() {
    private val viewModel: DialogViewModel<MainDialogResult> by activityViewModels()
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view: View = inflater.inflate(R.layout.dialogfragment , container , false)
        val accountEditView = view.findViewById<EditText>(R.id.account)
        val passwordEditView = view.findViewById<EditText>(R.id.password)
        val loginButton = view.findViewById<Button>(R.id.login)
        val cancelButton = view.findViewById<Button>(R.id.cancel)
        val progressBar = view.findViewById<ProgressBar>(R.id.progressBar)
        val pgBar = view.findViewById<ProgressBar>(R.id.progressBar2)
        progressBar.visibility = View.VISIBLE
        pgBar.max = 100
        Thread{
            for (i in 0..100){
                pgBar.progress = i
                //Thread.sleep(500)
                SystemClock.sleep(500)
            }
        }.start()
        pgBar.progress = 0

        val message = "ok"
        loginButton.setOnClickListener {
            viewModel.result.postValue(MainDialogResult.Ok(message))
            dismiss()
        }

        cancelButton.setOnClickListener {
            viewModel.result.postValue(MainDialogResult.Cancel)
            dismiss()
        }

        return view
    }
}

最後在activity中这要调用即可

val fm = supportFragmentManager
val dialog = FragmentDialog()
dialog.show(fm,"Blossom")

viewModel.result.observe(this){
    when(it){
        is MainDialogResult.Ok ->{
            Toast.makeText(this,it.message,Toast.LENGTH_SHORT).show()
        }
        is MainDialogResult.Cancel ->{
            Toast.makeText(this,"cancel",Toast.LENGTH_SHORT).show()
        }
    }

https://ithelp.ithome.com.tw/upload/images/20210925/20141791f44aeL7fcK.png


<<:  【Day10】模组化及引用模组

>>:  Day-13 Miku Memory

裁切,调整大小,旋转

提取ROI 在影像处理中是一个重要技能 像是在行人中要做人脸辨识 就必须找出人脸的位置座标 roi ...

[Day10] placeholder for d10

写在前面 placeholder for d10 placeholder for d10 place...

Day 33 打包-ios (部分)

昨天说的是 Android 今天我们来聊聊如何打包 ios, 但因为没有开发帐号,所以就只说 rea...

Day07 Flutter 和 Native 通讯的原理 01

Flutter 和 Native 通讯的原理 BinaryMessenger 从底层的角度来看,Fl...

Day29-Go gRPC(下)

前言 在上一篇,我们介绍了 gRPC 以及建例 proto 档,今天要来介绍如何使用 gRPC 来建...