Как получить контекст из MainActivity из любого места и как получить доступ к его функциям? - PullRequest
0 голосов
/ 15 февраля 2019

Я только недавно начал заниматься разработкой 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
    }
}

Было бы здорово, если бы я мог использовать функции из класса mainacctivity, но яЯ не очень знаком с языком, и поэтому я не могу сделать это (если это возможно) прямо сейчас.Это мой первый пост в stackoverflow, и мне очень жаль, если он низкого качества, я еще не знаком с системой.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

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 Класс деятельности немного сложнее)

0 голосов
/ 15 февраля 2019

Добро пожаловать в StackOverflow!

В вашем конкретном случае нет необходимости передавать экземпляр Context через конструктор, вместо этого вы можете получить доступ к WebView 'context свойство: все подклассы 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, предпочтительнее передать ее явно, чемхранение его в глобальных переменных - таким образом вы сможете предотвратить утечки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...