Переключение видимости в Kotlin, неразрешенная ссылка isVisible

Потихоньку изучаю Котлин. Просто генерирует случайное число из рулона. Если roll = 9, я хочу сделать кнопку и панель поиска невидимыми.

Для этого я использую функцию toggleVisibility, но компилятор Kotlin видит isVisible как неразрешенную ссылку.

package com.example.randomizer

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.SeekBar
import android.widget.TextView
import android.widget.VideoView
import java.util.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val rollButton = findViewById<Button>(R.id.rollButton)
        val resultsTextView = findViewById<TextView>(R.id.resultsTextView)
        val seekBar = findViewById<SeekBar>(R.id.seekBar)
        val winText = "9 You Win !"




        rollButton.setOnClickListener {
            val rand = Random().nextInt(seekBar.progress)
            resultsTextView.text = rand.toString()
            if (rand == 9) {
                resultsTextView.text = winText
                seekBar.toggleVisibility()
                rollButton.toggleVisibility()
            }

        }



    }

    fun View.toggleVisibility() {
        if (this.isVisible()) {
            this.visibility = View.INVISIBLE
        } else {
            this.visibility = View.VISIBLE
        }
    }
}

Ошибка компилятора:

unresolved reference isVisible

Я не думаю, что есть какой-то isVisible() метод, но лучше проверить if (visibility == View.VISIBLE). Это потому, что есть 3 возможных значения видимости: VISIBLE, INVISIBLE и GONE.

user2340612 05.06.2019 17:49
6
1
4 733
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы сами определили isVisible для просмотра?
В классе Вид нет метода с именемisVisible().

Как сказал @user2340612, это можно определить как:

fun View.isVisible(): Boolean {
    return this.visibility == View.VISIBLE
}

Спасибо, я предполагал, что в классе View будет метод isVisible.

Rob 05.06.2019 18:20

Он существует как расширение Kotlin, просто у вас нет правильной зависимости в соответствии с собственно правильный ответ.

ianhanniballake 05.06.2019 18:33

Внутри класса нет метода isVisible()View.
Вы можете определить свой метод расширения следующим образом:

fun View.toggleVisibility() {
    this.visibility = if (this.visibility == View.VISIBLE) View.INVISIBLE else View.VISIBLE
}

Как сказал @Вадим Котов, isVisible — это не метод, который существует внутри View. Однако существует функция getVisibility(), которая возвращает одно из трех возможных значений видимости: VISIBLE, INVISIBLE или GONE. Вы можете использовать эти результаты, чтобы определить видимость и настроить ее по своему усмотрению.

Как упоминалось выше, вы можете указать isVisible() в качестве функции расширения самостоятельно.

fun View.isVisible() = this.visibility == View.Visible

Или вы можете добавить зависимость представления KTX и начать использовать некоторые методы там. Я рекомендую вам взглянуть на: https://developer.android.com/reference/kotlin/androidx/core/view/package-summary#(android.view.View).isVisible:kotlin.Boolean

Чтобы импортировать и начать использовать KTX, добавьте свои зависимости в build.gradle

implementation "androidx.core:core-ktx:1.0.2"

KTX — это набор широко используемых расширений Kotlin. Проверьте также: https://developer.android.com/kotlin/ktx

Другие вопросы по теме