使用普通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的默认支持,又能满足透明需求:
- 在
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>
- 在
AndroidManifest.xml中为CommentActivity指定该主题:
<activity android:name=".CommentActivity" android:theme="@style/TransparentActivityTheme"/>
- 让Activity继承
AppCompatActivity:
class CommentActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 直接创建ViewModel val commentViewModel = ViewModelProvider(this)[CommentViewModel::class.java] } }
内容的提问来源于stack exchange,提问作者Hyejung
相关产品推荐
相关产品推荐

