Android ViewModel创建不受横竖屏切换影响原理详解

当Android设备发生横竖屏切换时,Activity会被销毁并被重新创建。这意味着,如果我们在Activity中存储数据,则这些数据将会丢失。如果我们使用ViewModel来存储数据,则这些数据将在Activity重新创建后仍然存在,因为ViewModel实例并不受Activity的生命周期影响。

以下是如何创建一个不受横竖屏切换影响的ViewModel的完整攻略:

步骤1:添加ViewModel依赖项

为了创建ViewModel,我们需要在我们的项目中添加ViewModel依赖项。添加以下依赖项到你的build.gradle文件中:

    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"

步骤2:创建ViewModel类

创建一个继承自ViewModel的新类,例如:

import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // 在这里添加ViewModel相关代码
}

在ViewModel类中添加你需要存储的数据和操作方法。

例如,下面的代码创建了一个简单的ViewModel类,用于存储和管理用户名称:

import androidx.lifecycle.ViewModel

class UserViewModel : ViewModel() {

    private var _name: String = ""

    fun setName(name: String) {
        _name = name
    }

    fun getName(): String {
        return _name
    }
}

步骤3:将ViewModel连接到Activity

要将ViewModel连接到Activity,请使用ViewModelProvider获取ViewModel实例。在Activity中,添加以下代码:

import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: UserViewModel

    private fun setupViewModel() {
        viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    }

    // 在这里添加其他Activity相关代码
}

ViewModelProvider在创建ViewModel实例时使用Activity作为参数。这样ViewModel就与Activity相关联了。

步骤4:使用ViewModel保存数据

现在我们已经创建了ViewModel,并将其连接到Activity,我们可以使用ViewModel的操作方法来保存和检索数据。例如,在Activity中,我们可以使用以下代码来设置和获取用户名:

viewModel.setName("John Doe")
val name =viewModel.getName()

当Activity重新创建后,我们仍然可以使用以下代码获取用户名,因为ViewModel实例已经保留了数据:

val name = viewModel.getName()

示例1:使用ViewModel保存Recycler View列表

下面是使用ViewModel保存Recycler View列表的示例:

import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {

    private var _items = mutableListOf<String>()

    fun addItem(item: String) {
        _items.add(item)
    }

    fun getItems(): List<String> {
        return _items
    }
}

class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel
    private lateinit var adapter: MyAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        adapter = MyAdapter(viewModel.getItems())

        // 设置RecyclerView和Adapter等
    }

    private inner class MyAdapter(private val items: List<String>) :
        RecyclerView.Adapter<MyViewHolder>() {

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(
                R.layout.list_item,
                parent,
                false
            )
            return MyViewHolder(view)
        }

        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            holder.bind(items[position])
        }

        override fun getItemCount(): Int {
            return items.size
        }
    }

    private inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun bind(item: String) {
            // 绑定数据到ViewHolder中
        }
    }
}

在这个示例中,我们使用一个ViewModel来管理RecyclerView列表数据。我们在ViewModel中保存了一个字符串列表,并使用getItem方法从ViewModel中获取数据。在Activity中,我们使用getItem方法从ViewModel中获取数据,并将数据传递给RecyclerView的Adapter。

示例2:使用ViewModel保存Fragment状态

下面是使用ViewModel保存Fragment状态的示例:

import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {

    private var _text = ""

    fun setText(text: String) {
        _text = text
    }

    fun getText(): String {
        return _text
    }
}

class MyFragment : Fragment() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val textView = view.findViewById<TextView>(R.id.text_view)

        if (savedInstanceState != null) {
            val text = savedInstanceState.getString("text")
            textView.text = text
            viewModel.setText(text)
        } else {
            val text = viewModel.getText()
            textView.text = text
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)

        val text = viewModel.getText()
        outState.putString("text", text)
    }
}

在这个示例中,我们使用一个ViewModel来管理Fragment的状态数据。我们在ViewModel中保存了一个字符串,并使用getText方法从ViewModel中获取数据。在Fragment中,我们使用getText方法从ViewModel中获取数据,并在onViewCreated方法中将数据显示到TextView中。在onSaveInstanceState方法中,我们将数据保存到Bundle中,以便在Fragment重新创建时恢复状态数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android ViewModel创建不受横竖屏切换影响原理详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • windows下zendframework项目环境搭建(通过命令行配置)

    以下是详细讲解“Windows下zendframework项目环境搭建(通过命令行配置)”的完整攻略。 环境准备 首先需要安装PHP环境,可以去PHP官网下载可执行文件,或者安装类似xampp的集成环境。然后在终端中输入php -v验证是否安装成功,如果出现版本信息则说明已经成功安装PHP。 接着需要安装Composer,可以去官网下载最新的Composer…

    other 2023年6月27日
    00
  • Android嵌套RecyclerView左右滑动替代自定义view

    Android嵌套RecyclerView左右滑动替代自定义view攻略 在Android开发中,有时候我们需要实现一个左右滑动的列表,通常可以使用自定义view来实现。然而,使用嵌套的RecyclerView也可以达到同样的效果,并且更加灵活和易于扩展。本攻略将详细介绍如何使用嵌套的RecyclerView来实现左右滑动列表,并提供两个示例说明。 步骤一:…

    other 2023年7月28日
    00
  • Android 布局文件Layout XML属性

    当我们在开发Android应用时,布局文件是非常重要的一部分。布局文件使用XML语言编写,用于定义应用界面的结构和外观。在布局文件中,我们可以使用各种属性来控制视图的位置、大小、样式等。下面是Android布局文件中常用的一些属性的详细说明: android:layout_width和android:layout_height:这两个属性用于设置视图的宽度和…

    other 2023年8月21日
    00
  • linux编译

    以下是Linux编译的完整攻略,包括两个示例说明。 1. Linux编译 在Linux中,编译源代码通常需要使用GNU编译器集合(GCC)和make工具。编译的过程通常包括以下步骤: 下载源代码: wget http://example.com/source.tar.gz 解压源代码: tar -zxvf source.tar.gz 进入源代码目录: cd …

    other 2023年5月9日
    00
  • RealProxy深入

    RealProxy深入的完整攻略 RealProxy是.NET Framework中的一个类,用于创建动态代理。动态代理是一种在运行时创建代理对象的技术,可以用于实现AOP(面向切面编程)等功能。在.NET Framework中,可以使用RealProxy类创建动态代理对象。 RealProxy的使用方法 使用RealProxy创建动态代理对象的步骤如下: …

    other 2023年5月5日
    00
  • Counter-Strike: cstrike.exe 应用程序错解决方法误

    解决 “Counter-Strike: cstrike.exe 应用程序错解决方法误” 问题,可以遵循以下步骤: 步骤一:重新安装游戏 首先,建议你尝试重新安装 Counter-Strike 游戏,因为该错误有可能是由游戏程序损坏或文件丢失造成的。 可以先卸载 Counter-Strike,然后再重新下载安装,确保下载的游戏文件没有损坏并且安装过程没有中途出…

    other 2023年6月25日
    00
  • VS2015 调试 条件和操作设置

    下面是“VS2015 调试 条件和操作设置的完整攻略”,包括条件断点和操作设置两部分,每部分包含一个示例说明。 条件断点 条件断点是在满足特定条件时才会触发断点,可以帮助我们更快地定位问题。可以按照以下步骤进行操作: 在代码中设置断点。 右键单击断点,选择“条件”。 在条件框中输入条件表达式。 点击“确定”按钮。 示例1:使用条件断点 在这个示例中,我们将演…

    other 2023年5月5日
    00
  • java的四种引用——强弱软虚

    Java的四种引用——强弱软虚 Java中的内存管理是一个关键问题,为了更好地利用内存资源,Java引入了垃圾回收机制,但是垃圾回收并不意味着内存就完全不需要管理了。Java中有四种引用类型,分别是强引用,弱引用,软引用和虚引用,这四种引用类型分别有不同的使用场景和生命周期,是Java内存管理的重要组成部分。 强引用 强引用是Java中默认的引用类型,如果存…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部