使用SetContentView设置视图实例后,活动如何访问该实例?我需要这个,因为活动使用了一个包含逻辑的自定义视图,我需要这个视图通过活动需要在视图中设置的自定义事件侦听器向活动发送事件。
我正在科特林的安卓工作室编程。我以前在活动中有所有的UI控制逻辑,所以我很好,但我正在自定义视图中分解一些UI代码,以便在几个活动中重用它。
以下是活动的初始化
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.custom_view)
// Here need to access the view instance
*xxxxxxx*.setCustomViewListener(new CustomView.MyCustomViewListener() {
@Override
public void onCancelled() {
// Code to handle cancellation from the view controls
}
});)
}
}
这是的视图布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button android:id="@+id/button_do"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Do" />
<com.kotlin.app.views.CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/view_custom" />
</FrameLayout>
这是自定义视图类CustomView.kt
class CustomView : FrameLayout, View.OnClickListener {
constructor(context: Context) : super(context)
init {
}
interface CustomViewListener {
fun onCancelled()
}
private var listener: CustomViewListener? = null
fun setCustomViewListener(listener: CustomerViewListener) {
this.listener = listener
}
你知道吗?
在Kotlin中,更常见的是使用Kotlin合成:
view_custom.setCustomViewListener(...)
注意:您似乎已经用Java编写了侦听器实现,而不是Kotlin。由于你的界面是在Kotlin中定义的,你需要这样的东西:
view_custom.setCustomViewListener(object : CustomView.MyCustomViewListener {
override fun onCancelled() {
...
}
})
Kotlin的SAM接口
就我个人而言,我喜欢用lambdas。不幸的是,您不能将lambda用作Kotlin SAM接口。然而,您可以使用类型别名而不是接口:
typealias MyCustomerViewListener = () -> Void
然后你可以用这个来代替:
view_custom.setCustomViewListener {
// listener code
}
在使用SetContentView设置视图实例后,活动如何访问视图实例?
步骤#1:将android:id
属性添加到根<FrameLayout>
元素。
步骤#2:在活动的onCreate()
中,在setContentView()
调用之后,调用findViewById()
以根据您在步骤#1中分配的ID检索FrameLayout
。
活动使用一个包含逻辑的自定义视图,我需要这个视图通过活动需要在视图中设置的自定义事件侦听器向活动发送事件
您也可以只调用findViewById()
并提供自定义视图的ID(findViewById(R.id.custom_view)
)。
请注意,这几乎涵盖了任何关于Android应用程序开发的书籍。