Làm cách nào để truy cập “Activity.this” trong Kotlin?


129

Tôi có đoạn mã Java này:

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

Tôi muốn lấy đối tượng MainActivity trong Kotlin. Chuyển đổi tự động ngắt lúc MainActivity.this.


Có thể this as MainActivity?
Marc Plano-Lesay

1
Và nếu mã này không có bên trong MainActivity, thì MainActivitynó được kết nối với phiên bản nào (và bằng cách nào)? Bạn muốn truy cập phiên bản thisnào?
phím nóng

Mã Java đang hoạt động chỉ tham chiếu đến activity.this, vậy một mã tĩnh? Tôi không chắc tho.
Bal0r

Có phải mã Java đang hoạt động cũng nằm trong một tệp hoàn toàn riêng biệt không?
yole

Mã này được gọi như thế nào, nếu không ở trong MainActivitynhưng vẫn truyền thissang MainActivity? Trong một lớp con có thể?
Marc Plano-Lesay

Câu trả lời:


238

Bạn có thể nhận được một tham chiếu đến MainActivityđối tượng của mình trong Kotlin bằng cách sử dụng một đủ điều kiệnthis . ví dụ:

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

1
Làm thế nào về Fragment? Tôi đã chèn Context vào Fragment (có @ActivityContextthuộc tính), bây giờ tôi cần Activity. Tất nhiên, tôi biết về getActivity()(Kotlin activity) trong Fragment, nhưng cách thứ hai có ổn không hay vì tôi có Context, tốt hơn là sử dụng nó để truy cập vào hoạt động?
Dr.jacky

@ Dr.jacky Tôi nghĩ bạn có thể làm diễn viên '(ngữ cảnh là? YourActivity)'. Bây giờ bạn có thể truy cập các phương thức hoạt động của mình
Gian Gomen

@ siddarth-g nếu bạn đang gặp sự cố với các tham chiếu chưa được giải quyết thì tôi khuyên bạn nên tạo một câu hỏi mới với MCVE để nhận trợ giúp.
mfulton26

@ mfulton26 vấn đề không biên dịch của nó, @ ActivityName này cũng không hoạt động với tôi trong một dự án khác.
Siddarth G

18

Hãy thử nhãn này thay thế

this@YourActivityName

1
tham chiếu unsolevd
Siddarth G

Nó không biên dịch
IgorGanapolsky

2
@IgorGanapolsky thay đổi ActivityName thành tên Activity của bạn -_-
Grecha

1

Nếu bạn đang gọi Activity. Cái này từ một lớp bên trong, bạn phải đặt bên trong trước lớp

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

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

@Allen bạn nói đúng, từ khóa bên trong là bắt buộc để truy cập Hoạt động bên trong lớp học
droidev

0

Giống như bạn làm trong java để lấy ngữ cảnh của hoạt động dưới dạng MainActivtiy.this, trong kotlin, bạn sẽ nhận được ngữ cảnh là @ MainActivity này


bạn thêm ý kiến ​​này để làm gì? Bạn có thể cung cấp cho một số tài liệu tham khảo đã giải quyết? Nó sẽ hữu ích cho chúng tôi, Vì vậy, chúng tôi sẽ theo dõi nó từ lần sau
The Bala

0

getActivity()tương đương với this@activity_name trường hợp trình xây dựng cho materialDialog

materialDialog = MaterialDialog.Builder(this)

0

Bạn có thể lấy đối tượng của hoạt động như thế này.

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

0

Trong Kotlin, bạn phải sử dụng cách này:

@ ActivityName này

Ví dụ: Bạn nên sử dụng nó nếu bạn muốn xác định "Ngữ cảnh" trong MainActivity.kt

var mContext:Context = this@MainActivity

Tại sao? Bởi vì trong ngôn ngữ Kotlin @ có nghĩa là "của" chẳng hạn như:

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

Nếu bạn muốn tìm hiểu thêm thông tin, bạn có thể xem trang web Ngôn ngữ Kotlin: Biểu thức này trong Kotlin

@canerkaseler

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.