我正在尝试创建一个覆盖透明的背景,该图像可以在Android应用程序中放大/缩小,并且是在Kotlin中开发的。
我的activity_main.xml中有这个文件:
<FrameLayout
android:id="@+id/overlay_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black_70"
android:visibility="gone">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
在片段中:
view.setOnClickListener {
(activity as MainActivity).overlayImage()
...
...
调用:
internal fun overlayImage() {
// val overlay_frame: View by Views.bind(this, R.id.overlay_frame) // also tried this
val overlay_frame: View = findViewById(R.id.overlay_frame)
overlay_frame.setOnClickListener {
// this is NOT called - why?
println("setOnClickListener executed 000")
Toast.makeText(this@MainActivity, "setOnClickListener hit!", Toast.LENGTH_SHORT).show()
overlay_frame.visibility = View.GONE
}
overlay_frame.visibility = View.VISIBLE
val url = "https://example.com/img/service/item1_img_01.jpg"
supportFragmentManager.beginTransaction().add(R.id.fragment_container, ImageDisplayFragment.newInstance(url)).commit()
}
它会正确调用overlayImage()方法和加载了图像的透明背景。
但是,“ overlay_frame.setOnClickListener()”方法不起作用。我希望当用户单击屏幕上的任意位置(而不是图像)时,它将执行setOnClickListnener()方法,但不是。 setOnClickListnener()方法中没有任何执行。
答案 0 :(得分:0)
view.setOnClickListener {
(activity as MainActivity).overlayImage()
}
单击view
时将执行代码块。
overlay_frame.setOnClickListener {
// this is NOT called - why?
println("setOnClickListener executed 000")
Toast.makeText(this@MainActivity, "setOnClickListener hit!", Toast.LENGTH_SHORT).show()
overlay_frame.visibility = View.GONE
}
同样,单击 overlay_frame 后,将执行代码块。
根据您粘贴的代码,您所做的只是在单击片段视图时,然后一次又一次在overlay_frame
中设置点击侦听器。 overlay_frame
的点击侦听器块将永远不会被调用,因为overlay_frame
不会消耗点击事件。
为什么不调用您的overlay_frame
点击监听器?
在activity_main.xml
文件中,“活动”的FrameLayout大小与“片段”的FrameLayout相同。
因为片段布局嵌套在“活动”布局中,所以您设置了片段视图单击侦听器,当您单击屏幕时,单击事件被片段视图占用。因此调用了activity.overlayImage()
方法。并且clicked事件不会传递给overlay_frame
。
您可以为overlay_frame
view.setOnClickListener {
(activity as MainActivity).overlayImage()
// get the overlay_frame from the activity
val overlay_frame = activity.getOverlayImage()
overlay_frame.performClick()
}
答案 1 :(得分:0)
啊!我找到了答案:
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="375dp"
android:layout_height="250dp" />
布局的宽度和高度以前是“ match_parent”。它会覆盖整个父对象,即使图像更小。通过更改以上内容,单击任意位置将关闭叠加背景和图像。
问题已解决。
(但是,还有另一个问题是图像居中。无论如何,这是一个不同的问题。)