จะเข้าถึง“ Activity.this” ใน Kotlin ได้อย่างไร?


130

ฉันมีโค้ด Java ชิ้นนี้:

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

ฉันต้องการรับวัตถุ MainActivity ใน Kotlin MainActivity.thisแบ่งแปลงโดยอัตโนมัติที่


อาจจะthis as MainActivity?
Marc Plano-Lesay

1
และถ้ารหัสนี้ไม่ได้อยู่ภายในMainActivityอินสแตนซ์MainActivityใดที่เชื่อมต่อกับ (และอย่างไร)? ท่านใดที่ต้องการตัวอย่างเช่นในการเข้าถึงเป็นthis?
ฮอต

โค้ด Java ที่ใช้งานได้อ้างอิงเฉพาะกิจกรรมนี่เป็นแบบคงที่หรือไม่? ฉันไม่แน่ใจ
Bal0r

โค้ด Java ที่ใช้งานได้อยู่ในไฟล์แยกต่างหากหรือไม่?
ยอ

รหัสนี้เรียกว่าอย่างไรถ้าไม่อยู่MainActivityแต่ยังส่งthisไปที่MainActivity? ในคลาสย่อยอาจจะ?
Marc Plano-Lesay

คำตอบ:


239

คุณจะได้รับการอ้างอิงถึงคุณMainActivityวัตถุใน Kotlin โดยใช้ที่มีคุณภาพ thisเช่น:

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

1
Fragment ล่ะ? ฉันได้ฉีด Context ลงใน Fragment แล้ว (พร้อม@ActivityContextแอตทริบิวต์) ตอนนี้ฉันต้องการกิจกรรม แน่นอนฉันรู้เกี่ยวกับgetActivity()(Kotlin activity) ใน Fragment แต่วิธีที่สองใช้ได้หรือไม่เพราะฉันมีบริบทจะดีกว่าถ้าใช้เพื่อเข้าถึงกิจกรรม
Dr.jacky

@ Dr.jacky ฉันคิดว่าคุณสามารถทำ '(บริบทเป็น? YourActivity)' ได้ ตอนนี้คุณสามารถเข้าถึงวิธีการทำกิจกรรมของคุณได้แล้ว
Gian Gomen

@ siddarth-g หากคุณมีปัญหาเกี่ยวกับการอ้างอิงที่ยังไม่ได้รับการแก้ไขฉันขอแนะนำให้สร้างคำถามใหม่ด้วยMCVEเพื่อรับความช่วยเหลือ
mfulton26

@ mfulton26 ปัญหาการไม่รวบรวม @ ActivityName นี้ใช้ไม่ได้สำหรับฉันในโครงการอื่นเช่นกัน
Siddarth G

18

ลองใช้ป้ายนี้แทน

this@YourActivityName

1
ข้อมูลอ้างอิงที่ไม่เปิดเผย
Siddarth G

ไม่ได้รวบรวม
IgorGanapolsky

2
@IgorGanapolsky เปลี่ยน ActivityName เป็นชื่อกิจกรรมของคุณ -_-
Grecha

1

หากคุณกำลังเรียกกิจกรรมจากชั้นในคุณต้องใส่innerก่อนชั้นเรียน

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

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

@ อัลเลนคุณถูกต้องคีย์เวิร์ดภายในจะต้องเข้าถึงกิจกรรมภายในคลาสชั้นใน
droidev

0

เช่นเดียวกับที่คุณทำใน java เพื่อรับบริบทของกิจกรรมเป็น MainActivtiy สิ่งนี้ใน kotlin คุณจะได้บริบทเป็น@ MainActivity นี้


คุณเพิ่มความคิดเห็นนี้เพื่ออะไร คุณสามารถให้ข้อมูลอ้างอิงที่แก้ไขแล้วได้หรือไม่? จะเป็นประโยชน์กับเราเพื่อที่เราจะได้ติดตามในครั้งต่อไป
The Bala

0

getActivity()เทียบเท่าthis@activity_name ในกรณีของตัวสร้างสำหรับ materialDialog

materialDialog = MaterialDialog.Builder(this)

0

คุณจะได้รับเป้าหมายของกิจกรรมเช่นนี้

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

0

ใน Kotlin คุณต้องใช้วิธีนี้:

นี้ @ ActivityName

ตัวอย่างเช่นคุณควรใช้หากคุณต้องการกำหนด "บริบท" ใน MainActivity.kt

var mContext:Context = this@MainActivity

ทำไม? เนื่องจากในภาษา Kotlin @ มีค่าเฉลี่ย "ของ" เช่น:

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

หากคุณต้องการเรียนรู้ข้อมูลเพิ่มเติมคุณสามารถดูเว็บไซต์ Kotlin Language: This Expression in Kotlin

@canerkaseler

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.