当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技术站