如何在Android / Kotlin中关闭叠加图像(setOnClickListener不起作用)?

时间:2019-05-21 13:48:50

标签: android kotlin onclicklistener

我正在尝试创建一个覆盖透明的背景,该图像可以在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()方法中没有任何执行。

2 个答案:

答案 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”。它会覆盖整个父对象,即使图像更小。通过更改以上内容,单击任意位置将关闭叠加背景和图像。

问题已解决。

(但是,还有另一个问题是图像居中。无论如何,这是一个不同的问题。)