เหตุใดฉันจึงไม่สามารถตั้งค่าผู้ฟังใน Kotlin ได้

ฉันมี OnClickInterface (ด้วยวิธี fun onClickShape()) Main.class และ FlipFragment.class และ ImageView (ซึ่งเรียกว่า image ในโค้ดของฉัน) เป้าหมายของฉันคือการทำให้ผู้ฟังเห็นภาพ

interface OnClickInterface {
  fun onClickShape()
}

กิจกรรมหลัก

class MainActivity : AppCompatActivity() {



  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    initTabs()
    var flip = FlipFragment()
    flip.listener = object : OnClickInterface {
      override fun onClickShape() {
        Log.d("MainActivity", "Shape Pressed")
        ToastUtils.showSuccessMessage(baseContext, "sometext")
      }

    } 
  }

  fun initTabs() {
    var adapter = TabsPagerFragmentAdapter(supportFragmentManager)
    mViewPager.adapter = adapter
    mTabLayout.setupWithViewPager(mViewPager)
  }
}

onCreate ใน FlipFragment

var image = view.findViewById<ImageView>(R.id.fShapeView)
    image.setOnClickListener(View.OnClickListener {
      Log.d("FlipFragment", "PRESSED")
      if (listener != null)
        listener!!.onClickShape()
    })

แอปโหลดได้ดีโดยไม่มีข้อผิดพลาด แต่เมื่อฉันกดในภาพ ฉันแสดงในบันทึก FlipFragment: PRESSED นั่นหมายความว่าวิธีการเรียกแอปพลิเคชันของฉันจาก FragmentFlip ไม่ใช่แทนที่วิธีการจาก MainActivity ทำไม

ฉันค้นหาข้อผิดพลาด แอพของฉันแสดง NPE ที่นี่

 flip.listener = object : OnClickInterface {
              override fun onClickShape() {
                Log.d("MainActivity", "Shape Pressed")
                ToastUtils.showSuccessMessage(baseContext, "someText")
              }}

ทำไมผู้ฟัง = null ฉันกำหนดมันด้วยคลาสที่ไม่ระบุชื่อ

รหัสทั้งหมดใน FlipFragment

class FlipFragment : Fragment() {
  private var layout = R.layout.view_flip
  var listener: OnClickInterface? = null

  override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
      savedInstanceState: Bundle?): View? {
    var view: View
    view = inflater!!.inflate(layout, container, false)
    var image = view.findViewById<ImageView>(R.id.fShapeView)
    image.setOnClickListener(View.OnClickListener {
      Log.d("FlipFragment", "PRESSED")
        if (listener != null){
         listener!!.onClickShape()}
    })
    return view
  }

  companion object {
    fun getInstanse(): FlipFragment {
      var args = Bundle()
      var flipFragment = FlipFragment()
      flipFragment.arguments = args
      return flipFragment
    }

  }


}

หากคุณต้องการโค้ดทั้งหมด มันคือ FragmentPagerAdapter.class

class TabsPagerFragmentAdapter(fm: FragmentManager?) : FragmentPagerAdapter(fm) {
  var tabs: Array<String> = arrayOf("Flip", "Multi")

  override fun getItem(position: Int) = when(position){
      0 -> FlipFragment.getInstanse()
      1 -> Mulit.getInstanse() //it is empty now
    else -> FlipFragment.getInstanse()
    }


  override fun getPageTitle(position: Int) = tabs[position]


  override fun getCount() = tabs.size
}

person manwhotrycoding    schedule 09.12.2017    source แหล่งที่มา
comment
ข้อมูลไม่เพียงพอ แจ้งรหัส FlipFragment ให้เราทราบ   -  person Dima Rostopira    schedule 09.12.2017
comment
@DimaRostopira เพิ่มโค้ดทั้งหมดของคลาสนี้   -  person manwhotrycoding    schedule 09.12.2017
comment
getInstance() ดูแปลก... แสดงโค้ด โดยที่คุณเพิ่มส่วน   -  person Dima Rostopira    schedule 09.12.2017
comment
@DimaRostopira ฉันได้เปลี่ยนคำอธิบาย MainActivity และเพิ่ม FragmentPagerAdapter.class   -  person manwhotrycoding    schedule 09.12.2017
comment
ฉันขอรหัสที่คุณแนบส่วนย่อยเข้ากับกิจกรรม คุณใช้ fragmentManager หรือส่วนนี้รวมอยู่ใน R.layout.activity_main หรือไม่   -  person Dima Rostopira    schedule 09.12.2017
comment
@DimaRostopira ฉันแนบแฟรกเมนต์Manager var adapter = TabsPagerFragmentAdapter(supportFragmentManager) mViewPager.adapter = adapter   -  person manwhotrycoding    schedule 09.12.2017
comment
ฉันเห็นว่าคุณสร้างอินสแตนซ์ของแฟรกเมนต์เท่านั้น แต่ไม่เห็นว่าคุณใช้มันที่ไหน   -  person Dima Rostopira    schedule 09.12.2017
comment
เหตุใดคุณจึงไม่ใช้ onAttach เพื่อรับอินสแตนซ์ Listener จากบริบท ฉันคิดว่านี่เป็นรูปแบบที่เหมาะสมในการรับผู้ฟัง   -  person victorldavila    schedule 09.12.2017
comment
ฉันแนบมันไว้ใน tabInit และลองเพิ่ม Listener ในวิธี OnCreate ให้กับรูปภาพซึ่งอยู่ที่ FlipFragment   -  person manwhotrycoding    schedule 09.12.2017
comment
ใน onCreate คุณกำลังสร้างตัวแปร ท้องถิ่น var flip = FlipFragment() โดยแนบ Listener เข้าไป จากนั้นตัวแปรจะหายไป (หากคุณแนบทั้ง onCreate)   -  person Dima Rostopira    schedule 09.12.2017
comment
OnClickInterface มีประโยชน์อย่างไร? คุณมี OnClickListener แนบมากับรูปภาพของคุณอยู่แล้วและใช้งานได้ เหตุใดจึงต้องทำให้สิ่งต่าง ๆ ซับซ้อนยิ่งขึ้น   -  person donfuxx    schedule 09.12.2017
comment
@victorldavila เป็นความคิดที่ดี แต่ฉันไม่รู้ว่าต้องทำอย่างไร ฉันจะลองค้นหาเกี่ยวกับเรื่องนี้   -  person manwhotrycoding    schedule 09.12.2017
comment
บางทีลิงค์นี้อาจช่วยคุณได้ @VadimMarchenko stackoverflow.com/questions/47513664/   -  person victorldavila    schedule 09.12.2017