Нижний OnClickListener всегда неразрешенный - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть простая кнопка в моем обзоре утилит, когда при первом нажатии она должна сделать текст редактируемым, при повторном нажатии она должна подтвердить изменение.У меня проблема в том, что у меня настроены два onClickListener, но они ссылаются друг на друга, и нижний всегда может разрешить верхний, а верхний не может разрешить нижний.

Recyclerview: bindIngredient

fun bindIngredient(ingredient: ListIngredientsQuery.Item, clickListener: RecyclerViewClickListener) {

    val ocl1 = View.OnClickListener{
        //Text Editable
        view.ingEditText.setText(view.ingNameTV.text.toString())
        view.ingNameTV.visibility = View.GONE
        view.ingEditText.visibility = View.VISIBLE
        view.ingEditButton.text = "Confirm"
        view.ingEditButton.setOnClickListener(ocl2)

    }

    var ocl2 = View.OnClickListener {
        //Text Not Editable
        view.ingNameTV.text = view.ingEditText.text
        view.ingEditText.visibility = View.GONE
        view.ingNameTV.visibility = View.VISIBLE
        view.ingEditButton.setOnClickListener(ocl1)
        clickListener.onConfirmSelect(ingredient)
    }

    this.ingredient = ingredient
    view.ingNameTV.text = ingredient.name()
    view.ingEditButton.setOnClickListener(ocl1)
    view.veganSpinner.setSelection(Vegan.valueOf(ingredient.vegan().toString()).ordinal, false)
    view.gfSpinner.setSelection(GlutenFree.valueOf(ingredient.glutenfree().toString()).ordinal, false)
}

В этом примере строка

view.ingEditButton.setOnClickListener(ocl2)

error, поскольку ocl2 не разрешена.Если я переключаю порядок двух объявляемых и инициализируемых onClickListener, строка

view.ingEditButton.setOnClickListener(ocl1)

выдает ошибку, поскольку ocl1 разрешен.Я полагаю, это означает, что он не будет смотреть вниз, чтобы найти то, что ему нужно, он будет полагаться только на объекты, которые уже были инициализированы.

Есть ли способ исправить это?Есть лучший способ сделать это?Я испытываю желание просто поместить две кнопки в одно и то же место, дать им каждый свой onclicklistener и поменять местами их видимость, но это кажется пустой тратой ресурсов.

1 Ответ

1 голос
/ 28 апреля 2019

Вам необходимо объявить свои объекты перед их использованием.

fun bindIngredient(ingredient: ListIngredientsQuery.Item, clickListener: RecyclerViewClickListener) {
    val ocl1: View.OnClickListener
    val ocl2: View.OnClickListener

    ocl1 = View.OnClickListener{
        //Text Editable
        view.ingEditText.setText(view.ingNameTV.text.toString())
        view.ingNameTV.visibility = View.GONE
        view.ingEditText.visibility = View.VISIBLE
        view.ingEditButton.text = "Confirm"
        view.ingEditButton.setOnClickListener(ocl2)
    }

    ocl2 = View.OnClickListener {
        //Text Not Editable
        view.ingNameTV.text = view.ingEditText.text
        view.ingEditText.visibility = View.GONE
        view.ingNameTV.visibility = View.VISIBLE
        view.ingEditButton.setOnClickListener(ocl1)
        clickListener.onConfirmSelect(ingredient)
    }

    this.ingredient = ingredient
    view.ingNameTV.text = ingredient.name()
    view.ingEditButton.setOnClickListener(ocl1)
    view.veganSpinner.setSelection(Vegan.valueOf(ingredient.vegan().toString()).ordinal, false)
    view.gfSpinner.setSelection(GlutenFree.valueOf(ingredient.glutenfree().toString()).ordinal, false)
}

Однако, было бы лучше, если бы вы просто использовали один OnClickListener. Вы можете просто сохранить состояние, в котором вы находитесь, и когда вы нажимаете кнопку, вы просто проверяете, в каком состоянии вы находитесь, выполняете свои действия, а затем изменяете состояние. Таким образом, вам не нужно беспокоиться о переключении ваших слушателей, что может стать грязным.

...