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

yizhihongxing

当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日

相关文章

  • 易语言获取网络下载的文件名方法

    获取网络下载文件的文件名一般可以通过从URL中提取文件名或下载完毕后从HTTP响应头中获取,下面分别介绍这两种方法的实现。 从URL中提取文件名 实现方法如下: 获取下载文件的完整URL。 使用Python的urllib.parse模块中的urlparse函数解析URL,获取URL的path部分。 使用Python的os.path模块中的basename函数…

    other 2023年6月26日
    00
  • Android使用ViewPager实现无限滑动效果

    Android使用ViewPager实现无限滑动效果攻略 在Android开发中,ViewPager是一个常用的控件,用于实现滑动切换不同的页面。然而,默认情况下,ViewPager只能滑动到最后一页或第一页,无法实现无限滑动效果。本攻略将详细介绍如何使用ViewPager实现无限滑动效果,并提供两个示例说明。 步骤一:导入依赖库 首先,在项目的build.…

    other 2023年9月6日
    00
  • animate.css教程

    animate.css教程 animate.css是一个轻量级的CSS动画库,可以帮助开发者快速实现各种动画效果。本文将详细介绍animate.css的使用方法,并提供两个示例说明。 安装 可以通过以下两种方式安装animate.css: 下载animate.css文件,然后将其引入到HTML文件中: <link rel="styleshee…

    other 2023年5月7日
    00
  • iphone11怎么设置快速重启 快速重启方法介绍

    iPhone 11快速重启设置和方法介绍 如其名,快速重启是让 iPhone 在不用完全关机的情况下重新启动,由于无需大规模的磁盘扫描和其他清理工作,因此速度较其他方法更快。 以下是你可以通过设置和按键的组合来快速重启你的 iPhone 11 设置快速重启 1.打开设置应用程序 2.选择“通用” 3.向下滚动,选择“关闭” 4.向下滚动至“关闭” 5.选择“…

    other 2023年6月26日
    00
  • win7右键菜单找不到新建BMP图像的快捷方式怎么办?

    当你在Win7系统中右键菜单找不到新建BMP图像的快捷方式时,可以按照以下步骤排查和解决: 检查注册表是否有异常 Win7中菜单的显示是通过注册表来配置的。如果菜单条目不存在于注册表中,就不会显示在右键菜单中。 首先,打开注册表编辑器:Win+R键打开“运行”窗口,输入“regedit”,按回车键。 然后,进入注册表路径:HKEY_CLASSES_ROOT.…

    other 2023年6月27日
    00
  • bootstrap中的导航条实例代码详解

    Bootstrap中的导航条实例代码详解 1. 导航条的基本结构 在Bootstrap中,导航条(Navbar)是一种常见的网站导航组件。它提供了丰富的样式和功能选项。以下是导航条的基本结构: <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a c…

    other 2023年6月28日
    00
  • jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较

    为了在页面加载时添加加载中效果,我们可以使用jQuery Mobile提供的”loading”插件。该插件会在页面上显示一个加载中的图标动画,直到页面的所有资源(包括外部CSS和JavaScript文件)加载完成,然后再隐藏加载中的图标。在使用该插件时,需要注意jQuery Mobile的生命周期事件顺序。 jQuery Mobile的生命周期事件顺序是: …

    other 2023年6月25日
    00
  • 前端存储

    前端存储 前端存储是指在浏览器端存储数据的技术,它可以使网页在不同的浏览器和设备之间共享数据,提高用户体验。本文将详细介绍前端存储的几种方式,包括Cookie、localStorage、sessionStorage和IndexedDB,并提供示例说明。 Cookie Cookie是一种在浏览器存储数据的技术,它可以存储少量的数据,并在浏览器和服务器之间传递数…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部