Как отключить наложение изображения в Android / Kotlin (setOnClickListener не работает)? - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь создать наложенный прозрачный фон с изображением, которое можно вводить / выводить для приложения для 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 голосов
/ 21 мая 2019

Ах! Я нашел ответ:

<FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="375dp"
        android:layout_height="250dp" />

Ширина и высота макета ранее были "match_parent". Он перекрывает весь родительский элемент, даже изображение меньше. При изменении вышеизложенного щелчок в любом месте приведет к удалению наложенного фона и изображения.

Проблема решена.

(Однако есть еще одна проблема, связанная с тем, что изображение не центрируется. В любом случае, это другая проблема.)

0 голосов
/ 21 мая 2019
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(). И событие, по которому щелкнули, не перейдет к 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()
}
...