📜  在视图模型 kotlin 中获取上下文(1)

📅  最后修改于: 2023-12-03 15:08:06.239000             🧑  作者: Mango

在视图模型 Kotlin 中获取上下文

在 Android 中,上下文是一个非常重要的概念,它允许我们获取应用程序的资源,如布局、字符串、颜色和主题。在视图模型中,我们需要上下文来访问这些资源。本文将介绍在视图模型 Kotlin 中获取上下文的不同方法。

在视图模型中使用 AndroidViewModel

AndroidViewModel 是 ViewModel 的子类,它提供了一个 Application 对象作为上下文,可以在 ViewModel 中使用。

class MyViewModel(application: Application) : AndroidViewModel(application) {
    // ...
}

使用 AndroidViewModel 很简单,只需在视图模型中声明它,然后将 application 作为参数传递即可。

在视图模型中使用 ViewModelProvider

如果您没有使用 AndroidViewModel,也可以使用 ViewModelProvider 来获取上下文。ViewModelProvider 可以将 Activity 或 Fragment 传递给 ViewModel,从而使 ViewModel 可以使用 Activity 或 Fragment 的 Context。

class MyFragment : Fragment() {
    private lateinit var viewModel: MyViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        // ...

        return view
    }
}
class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel

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

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

        setContentView(view)
    }
}

使用 ViewModelProvider 很简单,只需传递 Activity 或 Fragment 作为参数,然后获取相应的 ViewModel 即可。

在视图模型中使用 DataBinding

如果您使用了 DataBinding,那么将上下文传递给视图模型就更加容易了。在布局文件中使用 data 标签将视图模型与上下文绑定,然后在视图模型中直接访问它。

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="viewModel" type="com.example.MyViewModel" />
    </data>

    <!-- ... -->
</layout>
class MyViewModel : ViewModel() {
    lateinit var context: Context

    fun setContext(context: Context) {
        this.context = context
    }

    // ...
}

使用 DataBinding,您只需将上下文传递给视图模型即可。这使得在视图模型中访问上下文变得非常容易。

总结

在视图模型中获取上下文是一项重要的任务,因为它允许我们访问应用程序的资源。无论您是使用 AndroidViewModel、ViewModelProvider 还是 DataBinding,获取上下文都非常容易。请根据您的需求和应用程序的架构选择最适合您的方法。