【问题标题】:Referring to a member of MainActivity in another class在另一个类中引用 MainActivity 的成员
【发布时间】:2020-06-05 20:55:34
【问题描述】:

我的 MainActivity 是这样开始的:

class MainActivity : AppCompatActivity() {
val mDBAdapter = DBAdapter(this, "nearbydata")

我想在另一个类 PickFromList(它扩展 ListActivity)中使用数据库适配器。

我似乎无法将其称为 MainActivity.mDBAdapter。我知道这是因为没有 MainActivity 类的实例。

How to reference the current or main activity from another class 称,这是“许多开发人员都遇到的问题”。该线程中的最佳答案是

如果你已经有一个有效的上下文,只需使用这个:Activity activity = (Activity) context;

不幸的是,对于像我这样没有经验的人来说这没有帮助。我怎么知道我是否有一个有效的上下文?如果我没有,我如何获得?

如果我尝试将该代码粘贴到我的 PickFromList 类中,Quick Fix 会告诉我它“无法解析符号 'context'”并提供创建局部变量 'context'。但这无济于事。

【问题讨论】:

    标签: android android-activity member


    【解决方案1】:

    您不应该从一个活动引用另一个活动,因为它可能导致内存泄漏和崩溃 (https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e) 然后你应该通过全局状态或依赖注入来共享这个 DBAdapter 实例。在这种情况下,您可以使用应用程序上下文来实例化 DBAdapter。 例如你可以使用你的 App 类

    class App : Application() {
    
        companion object {
            lateinit var adapter: DBAdapter
        }
    
        override fun onCreate() {
            super.onCreate()
            adapter = DBAdapter(this)
        }
    }
    

    这是安全的,因为您只有一个 App 类实例,因此只有一个应用程序上下文。 在此之后,您可以在您的活动中使用 App.adapter 之类的适配器。

    但这是粗略的解决方案。更好的方法是通过依赖注入 (https://developer.android.com/training/dependency-injection) 为您提供依赖项

    【讨论】:

    • 非常感谢您非常有帮助的回复。当您提到我的 App 类时,我不确定这是否是由 Android Studio 自动创建的。我以为不是,所以添加了一个新的 Kotlin 文件并粘贴到您的 App 类代码中,它工作了!这似乎是一种创建全局变量的有效方法。我在某处读到不推荐它,但没有提供不推荐的原因。我希望在适当的时候看看依赖注入,但目前这在我浅薄的学习曲线中感觉太远了!
    • 更多关于应用类github.com/codepath/android_guides/wiki/…。全局变量并没有错,但如果你不小心使用它们,你可能会得到难以测试和维护的糟糕的应用程序设计。这是一个非常容易使用的全局变量——这就是它们分布在你所有代码库中的原因。但是如果你通过构造函数传递这个全局变量,你的类就不会依赖它们,你可以很容易地测试它。这就是依赖注入的主要思想。
    • 当我早些时候回答修改后的代码有效时,我依赖于 Android Studio 不再显示任何错误这一事实。直到现在我才尝试运行该应用程序,并发现它在我的主要活动中的“val mDBAdapter = App.adapter”行出现错误而停止。 Logcat 说 Caused by: kotlin.UninitializedPropertyAccessException: lateinit property adapter has not been initialized at com.example.nearby.App$Companion.getAdapter(App.kt:9) at com.example.nearby.MainActivity.(MainActivity.节:31)。我必须创建 App 类的实例吗?
    • 不,你不应该实例化 App 类。您只需在 AndroidManifest (stackoverflow.com/questions/2929562/…) 上注册即可
    • Yours Manifest.xml 文件应该只包含一个 块。在这个块中你应该指定名称属性<application android:name="[YOUR APP CLASS]> ...activities, services, meta-data .... </application>"
    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2015-03-15
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多