如何从任何地方从MainActivity获取上下文以及如何访问其功能?

时间:2019-02-14 23:25:16

标签: android android-studio kotlin

最近,在我被卡住之后不久,我就开始着手进行android开发。 我想知道如何获取MainActivity的上下文及其全局功能(如果可能)

我唯一需要使用的方法是将上下文作为参数传递给另一个类的构造函数。 this @ MainActivity不起作用,也无法尝试获取诸如MainActivity.getContext()这样的函数来返回上下文。

class MainActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        webView1.settings.javaScriptEnabled = true
        webView1.webViewClient = Client(this) //Initialize the class

        webView1.loadUrl("https://www.urbs.curitiba.pr.gov.br/mobile/cartao")
    }

    fun getContext(): Context //Not accessible from Client
    {
        return getContext()
    }

}

//Client class
class Client(context: Context): WebViewClient()
{
    val context: Context = context //This works

    override fun onPageFinished(view: WebView, url: String)
    {
        webView1.loadUrl("https://kotlinlang.org/docs/reference/this-expressions.html")
        Toast.makeText(context, "Uau", Toast.LENGTH_SHORT).show()
        //using this@MainActivity as context is not defined
    }
}

如果我可以使用mainactivity类中的函数,但我对语言不是很熟悉,那么我现在就无法这样做(如果可能的话),那会很棒。 这是我在stackoverflow上的第一篇文章,如果它的质量很低,我真的很抱歉,我还没有熟悉该系统。

2 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow!

在您的特定情况下,无需通过构造函数传递Context的实例,而可以访问WebView的{​​{3}}属性:全部View Android中的子类引用了Context实例。

//Client class
class Client : WebViewClient()
{
    override fun onPageFinished(view: WebView, url: String)
    {
        webView1.loadUrl("https://kotlinlang.org/docs/reference/this-expressions.html")
        Toast.makeText(view.context, "Uau", Toast.LENGTH_SHORT).show()
    }
}

通常,如果您需要引用Context,则最好将其显式传递而不是将其存储在全局变量中-这样,您就可以防止内存泄漏。

答案 1 :(得分:0)

MainActivity.getContext()意味着MainActivity类中有一个名为getContext的公共静态方法,而没有;

关于您的情况,您已经将MainActivity实例传递给Client类,因此您可以对其进行强制转换并调用getContext()方法:

class Client(context: Context): WebViewClient()
{
    private val context: MainActivity = context as MainActivity //This works

    override fun onPageFinished(view: WebView, url: String)
    {
        webView1.loadUrl("https://kotlinlang.org/docs/reference/this-expressions.html")
        Toast.makeText(context, "Uau", Toast.LENGTH_SHORT).show()
        //now its possible
    }
}

关于全局访问类实例(例如MainActivity),您始终可以将实例放在公共静态变量中,并从任何地方访问它们(但是为Android Activity类实现此操作有点棘手)