Bagaimana cara mengakses "Activity.this" di Kotlin?


129

Saya memiliki kode Java ini:

MaterialDialog builder = new MaterialDialog.Builder(MainActivity.this)

Saya ingin mendapatkan objek MainActivity di Kotlin. Konversi otomatis berhenti pada MainActivity.this.


Mungkinkah this as MainActivity?
Marc Plano-Lesay

1
Dan jika kode ini tidak ada di dalam MainActivity, lalu ke mana MainActivityia terhubung (dan bagaimana)? Contoh mana yang ingin Anda akses this?
hotkey

Kode Java yang berfungsi hanya mereferensikan activity.this, jadi yang statis? Saya tidak yakin itu.
Bal0r

Apakah kode Java yang berfungsi juga dalam file yang sepenuhnya terpisah?
yole

Bagaimana kode ini dipanggil, jika tidak di MainActivitytetapi masih mentransmisikan thiske MainActivity? Mungkin di subclass?
Marc Plano-Lesay

Jawaban:


238

Anda bisa mendapatkan referensi untuk Anda MainActivityobjek dalam Kotlin dengan menggunakan berkualitasthis . misalnya:

class MyActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@MyActivity)
}

1
Bagaimana dengan Fragment? Saya telah memasukkan Konteks ke dalam Fragmen (dengan @ActivityContextatribut), sekarang saya membutuhkan Aktivitas. Tentu saja, saya tahu tentang getActivity()(Kotlin activity) di Fragmen, tetapi apakah cara kedua baik-baik saja atau karena saya memiliki Konteks, lebih baik menggunakannya untuk mengakses aktivitas?
Dr.jacky

@ Dr.jacky Saya pikir Anda dapat melakukan '(konteks sebagai? Aktivitas Anda)'. Sekarang Anda dapat mengakses metode aktivitas Anda
Gian Gomen

@ siddarth-g jika Anda mengalami masalah dengan referensi yang belum terselesaikan, saya sarankan untuk membuat pertanyaan baru dengan MCVE untuk mendapatkan bantuan.
mfulton26

@ mfulton26 ini bukan masalah kompilasi @ ActivityName ini tidak berfungsi untuk saya di proyek lain juga.
Siddarth G

18

Coba label ini sebagai gantinya

this@YourActivityName

1
referensi unresolevd
Siddarth G

Itu tidak dapat dikompilasi
IgorGanapolsky

2
@IgorGanapolsky mengubah ActivityName menjadi nama Aktivitas Anda -_-
Grecha

1

Jika Anda memanggil Activity.this dari kelas dalam, Anda harus meletakkan batin sebelum kelas

class MyActivity : MainActivity() {
    // Call from class itself
    val builder = MaterialDialog.Builder(this@MyActivity) 

    inner class Inner {
        this@MyActivity // Call from the inner class 
    }
}

@ Jika Anda benar, kata kunci dalam diperlukan untuk mengakses Aktivitas di dalam kelas dalam
droidev

0

Seperti yang Anda lakukan di java untuk mendapatkan konteks aktivitas sebagai MainActivtiy.this, di kotlin Anda akan mendapatkan konteks seperti ini @ MainActivity.


apakah Anda menambahkan komentar ini untuk apa? Bisakah Anda memberikan beberapa referensi yang terselesaikan? Ini akan membantu kami, Sehingga kami akan mengikutinya dari waktu berikutnya
The Bala

0

getActivity()setara this@activity_name dalam kasus pembangun untuk materialDialog

materialDialog = MaterialDialog.Builder(this)

0

Anda bisa mendapatkan objek aktivitas seperti ini.

class DemoActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@DemoActivity)
}

0

Di Kotlin, Anda harus menggunakan cara ini:

ini @ ActivityName

Misalnya: Anda harus menggunakannya jika Anda ingin mendefinisikan "Konteks" di MainActivity.kt

var mContext:Context = this@MainActivity

Mengapa? Karena dalam bahasa Kotlin @ memiliki arti "dari" seperti:

val a = this@A // A's this

Jika Anda ingin mempelajari lebih lanjut, Anda dapat melihat situs Bahasa Kotlin: Ekspresi ini di Kotlin

@bayu_joo

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.