简体   繁体   中英

How to keep Custom View's data in Android using viewmodel mvvm?

I wanna keep my data from rotating device. Instead of using android:configChanges="orientation|keyboardHidden", I want to use ViewModel. How can I do it? What i want to keep is mydata_x,mydata_y,mydata_color,var radiusarray . I wanna keep my data from rotating device. Instead of using android:configChanges="orientation|keyboardHidden", I want to use ViewModel. How can I do it? What i want to keep is mydata_x,mydata_y,mydata_color,var radiusarray .

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding =
            DataBindingUtil.setContentView(this, R.layout.activity_main)
        val viewModel: MainActivityViewModel by viewModels()
        binding.main = viewModel
        binding.lifecycleOwner = this
viewModel.myData_x.observe(this, {
            binding.pdfView.myData_x = it
        })
        val listener = View.OnClickListener {
            when (it) {
                binding.decreaseValue -> MyView.radius -= 2
                binding.increaseValue -> MyView.radius += 2
                binding.setRed -> MyView.whatColor = 1
                binding.setBlue -> MyView.whatColor = 2
                binding.setYellow -> MyView.whatColor = 3
                binding.setGreen -> MyView.whatColor = 4
                binding.setBlack -> MyView.whatColor = 0
            }
        }
     ...
    }
}

MainActivity.kt

class MainActivityViewModel : ViewModel() {
    private val _myData_x = MutableLiveData(IntArray(30000))
    val myData_x: LiveData<IntArray>
        get() = _myData_x
    ...
}

MainActivityViewModel.kt

class MyView(context: Context?, attr: AttributeSet) : View(context) {
    var p1 = Paint()
    var p2 = Paint()
    var p3 = Paint()
    var p4 = Paint()
    var p5 = Paint()
    var myData_x = IntArray(30000)
    var myData_y = IntArray(30000)
    var myData_color = IntArray(30000)
    var radiusArray = IntArray(30000)

    companion object {
        var radius = 15
        var whatColor = 0
    }

    var dataNumber = 0
    var mx = 0
    var my = 0

    init {
        myData_x[0] = 0
        myData_y[0] = 0
        myData_color[0] = 0
        radiusArray[0] = 15
        p1.color = Color.BLACK
        p2.color = Color.RED
        p3.color = Color.BLUE
        p4.color = Color.YELLOW
        p5.color = Color.GREEN
    }

    ...
    private fun saveData() {
        myData_x[dataNumber] = mx
        myData_y[dataNumber] = my
        myData_color[dataNumber] = whatColor
        radiusArray[dataNumber] = radius
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        mx = event.x.toInt()
        my = event.y.toInt()
        dataNumber += 1
        saveData()
        return true
    }
}

MyView.kt

<....MyView
        android:id="@+id/paint_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

I finally found the way.

 override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        myViewViewModel.saveAlldata(
            binding.pdfView.myData_x, binding.pdfView.myData_y,
            binding.pdfView.myData_color, binding.pdfView.radiusArray, binding.pdfView.dataNumber
        )
    }

Just using onsavedinstancestate, I can save status to viewmodel.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM