首页 > 解决方案 > 将 OnClick 侦听器从超级片段分配给新活动

问题描述

我正在尝试在新类中分配 ImageView 的 OnClick 侦听器。

问题:问题是片段类不是open不能被继承的。我正在添加一个位于fragment_home.xml. 我只能继承超级活动,所以我想知道是否可以从新活动中分配监听器?我尝试了以下方法,但它只是使应用程序崩溃...

NewActivity.kt

class MainActivity : SuperMainActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val abcImageView = findViewById<ImageView>(R.id.abc)
        abcImageView?.setOnClickListener { Todo() }
    }
}
...

fragment_home.xml

...
<ImageView
    android:id="@+id/abc"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:contentDescription="@string/abc"
    android:scaleType="matrix"
    android:src="@drawable/abc" />
...

提前致谢!

编辑:当我点击 ImageView 时,它会显示这样的run日志......

I/ViewRootImpl@91838a8[MainActivity]: ViewPostIme pointer 0
I/ViewRootImpl@91838a8[MainActivity]: ViewPostIme pointer 1

标签: android

解决方案


我不确定我们是否可以直接传递一个函数,但传递一个对象是可能的。所以onClickListener在一个类中包装并实现Parcelable必须做到这一点

尝试以下

@Parcelize
class TransposableClickListener(val clickListener : () -> Unit) : Parcelable{
   fun onClick() = clickListener()
}

现在你可以尝试类似的东西,

//base activity class

val intent = Intent(context, NextActivity::class.java);
var bundle = Bundle()
val transposableClickListener = TransposableClickListener(::ToDo)
bundle.putParcelable("clickListener",transposableClickListener)
intent.putExtra("myBundle",bundle)
startActivity(intent);
//destination activity class
val bundle = intent.getBundleExtra("myBundle")
var clickListener = bundle.getParcelable<TransposableClickListener>("clickListener") as TransposableClickListener

//usage will be
textview.setOnClickListener{
clickListener.onClick()
}

推荐阅读