You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用普通Activity实现透明背景后,无法作为ViewModelStoreOwner创建ViewModel怎么办?

解决普通Activity无法作为ViewModelStoreOwner创建ViewModel的问题

方法一:手动实现ViewModelStoreOwner接口

普通Activity未实现ViewModelStoreOwner接口,你可以直接在Activity中实现该接口并维护ViewModelStore实例:

class CommentActivity : Activity(), ViewModelStoreOwner {
    private lateinit var viewModelStore: ViewModelStore

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModelStore = ViewModelStore()
        // 初始化布局等其他逻辑
    }

    override fun getViewModelStore(): ViewModelStore {
        return viewModelStore
    }

    override fun onDestroy() {
        super.onDestroy()
        viewModelStore.clear() // 销毁时清理ViewModel,防止内存泄漏
    }
}

之后就能正常使用this创建ViewModel:

val commentViewModel = ViewModelProvider(this)[CommentViewModel::class.java]

方法二:直接传入ViewModelStore实例

如果不想实现接口,也可以手动创建ViewModelStore,并传入ViewModelProvider的构造方法:

class CommentActivity : Activity() {
    private lateinit var viewModelStore: ViewModelStore
    private lateinit var commentViewModel: CommentViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModelStore = ViewModelStore()
        commentViewModel = ViewModelProvider(viewModelStore)[CommentViewModel::class.java]
    }

    override fun onDestroy() {
        super.onDestroy()
        viewModelStore.clear()
    }
}

方法三:改用AppCompatActivity+透明主题(更推荐)

其实你不需要放弃AppCompatActivity来实现透明背景,只需为Activity设置透明主题即可,这样既能直接使用ViewModel的默认支持,又能满足透明需求:

  1. 在res/values/styles.xml中定义透明主题:
<style name="TransparentActivityTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
    <item name="windowNoTitle">true</item>
</style>
  1. 在AndroidManifest.xml中为CommentActivity指定该主题:
<activity
    android:name=".CommentActivity"
    android:theme="@style/TransparentActivityTheme"/>
  1. 让Activity继承AppCompatActivity:
class CommentActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 直接创建ViewModel
        val commentViewModel = ViewModelProvider(this)[CommentViewModel::class.java]
    }
}

内容的提问来源于stack exchange,提问作者Hyejung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:50:45