Проблема с манипулированием макетом внутри функции в качестве аргумента;view.editText не должен быть нулевым - PullRequest
0 голосов
/ 06 ноября 2019

Я создал метод для повторного использования 4 раза, чтобы уменьшить количество кода, который я вставляю. По какой-то причине, когда код превращен в функцию, он больше не работает.

Он работает, не будучи функцией.

    private fun onEditTextAnimation(view: View, b: Boolean) {
        if (b) {
            view.customEditTextBoxMain.layoutParams.height = pxToDP(35)
            view.customEditTextBoxHint.layoutParams.height = pxToDP(15)
            view.customEditTextBoxHint.visibility = View.VISIBLE
            view.redLine.visibility = View.VISIBLE
        }
        if (!b) {
            view.customEditTextBoxMain.layoutParams.height = pxToDP(50)
            view.customEditTextBoxHint.visibility = View.GONE
            view.redLine.visibility = View.GONE
        }
    }


// THIS HERE IS THE FUNCTION BEING USED IN A PLACE WHERE THE FUNCTIONS'S BODY WORKED WITHOUT BEING EXTRACTED INTO A FUNCTION
// THIS HERE IS THE FUNCTION BEING USED IN A PLACE WHERE THE FUNCTIONS'S BODY WORKED WITHOUT BEING EXTRACTED INTO A FUNCTION


        jiken0.customEditTextBoxMain.setOnFocusChangeListener { view, b -> onEditTextAnimation(view, b) }

// THIS HERE IS THE FUNCTION BEING USED IN A PLACE WHERE THE FUNCTIONS'S BODY WORKED WITHOUT BEING EXTRACTED INTO A FUNCTION. BELOW ARE THE OTHER 3 FUNCTIONS FOR WHICH I INTENDED THE EXTRACTED FUNCTION
// THIS HERE IS THE FUNCTION BEING USED IN A PLACE WHERE THE FUNCTIONS'S BODY WORKED WITHOUT BEING EXTRACTED INTO A FUNCTION. BELOW ARE THE OTHER 3 FUNCTIONS FOR WHICH I INTENDED THE EXTRACTED FUNCTION

        jiken1.customEditTextBoxMain.setOnFocusChangeListener { view, b ->
            if (b) {
                jiken1.customEditTextBoxMain.layoutParams.height = pxToDP(35)
                jiken1.customEditTextBoxHint.layoutParams.height = pxToDP(15)
                jiken1.customEditTextBoxHint.visibility = View.VISIBLE
                jiken1.redLine.visibility = View.VISIBLE
            }
            if (!b) {
                jiken1.customEditTextBoxMain.layoutParams.height = pxToDP(50)
                jiken1.customEditTextBoxHint.visibility = View.GONE
                jiken1.redLine.visibility = View.GONE
            }
        }

        jiken2.customEditTextBoxMain.setOnFocusChangeListener { view, b ->
            if (b) {
                jiken2.customEditTextBoxMain.layoutParams.height = pxToDP(35)
                jiken2.customEditTextBoxHint.layoutParams.height = pxToDP(15)
                jiken2.customEditTextBoxHint.visibility = View.VISIBLE
                jiken2.redLine.visibility = View.VISIBLE
            }
            if (!b) {
                jiken2.customEditTextBoxMain.layoutParams.height = pxToDP(50)
                jiken2.customEditTextBoxHint.visibility = View.GONE
                jiken2.redLine.visibility = View.GONE
            }
        }

        jiken3.customEditTextBoxMain.setOnFocusChangeListener { view, b ->
            if (b) {
                jiken3.customEditTextBoxMain.layoutParams.height = pxToDP(35)
                jiken3.customEditTextBoxHint.layoutParams.height = pxToDP(15)
                jiken3.customEditTextBoxHint.visibility = View.VISIBLE
                jiken3.redLine.visibility = View.VISIBLE
            }
            if (!b) {
                jiken3.customEditTextBoxMain.layoutParams.height = pxToDP(50)
                jiken3.customEditTextBoxHint.visibility = View.GONE
                jiken3.redLine.visibility = View.GONE
            }
        }

    }

Это XML макета, который яповторное использование:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:paddingLeft="20dp"
        android:focusable="true"
        android:id="@+id/customEditTextBoxMain"
        android:hint="PlaceolderMain"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@android:color/white"
        android:ems="10"
        android:inputType="textPersonName"/>

    <View
        android:visibility="gone"
        android:id="@+id/redLine"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/holo_red_light"/>

    <TextView
        android:visibility="gone"
        android:textSize="10dp"
        android:id="@+id/customEditTextBoxHint"
        android:layout_width="match_parent"
        android:layout_height="15dp"
        android:background="@android:color/white"
        android:hint="PlaceolderHint"
        android:paddingLeft="20dp"
        android:gravity="left"/>
</LinearLayout>

Каждое включение этого макета называется "jiken0", "jiken1" и т. д.

Я хотел бы повторно использовать эту функцию в 4 нужных ей случаяхбудет использоваться.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Ответ заключается в том, что мне нужно было получить родительский макет editText, для которого вызывается onEditTextAnimation, а затем преобразовать «представление» из выражения lamba в то, чем является это представление (в моем случае это настраиваемый макет многократного использования).

добавление этой строки:

val r = view.parent as LinearLayout

в начало функции многократного использования решило проблему. В целом, готовый код функции выглядит следующим образом.

private fun onEditTextAnimation(view: View, b: Boolean) {
    val r = view.parent as LinearLayout
    if (b) {
        r.customEditTextBoxMain.layoutParams.height = pxToDP(35)
        r.customEditTextBoxHint.layoutParams.height = pxToDP(15)
        r.customEditTextBoxHint.visibility = View.VISIBLE
        r.redLine.visibility = View.VISIBLE
    }
    if (!b) {
        r.customEditTextBoxMain.layoutParams.height = pxToDP(50)
        r.customEditTextBoxHint.visibility = View.GONE
        r.redLine.visibility = View.GONE
    }
}

Если у вас есть какой-либо четкий совет о том, как я могу улучшить свое кодирование, скажите, пожалуйста. Спасибо.

0 голосов
/ 06 ноября 2019

Попробуйте изменить свою лямбду с этого:

jiken0.customEditTextBoxMain.setOnFocusChangeListener { view, b -> onEditTextAnimation(view, b) }

на это:

jiken0.customEditTextBoxMain.setOnFocusChangeListener { _, b -> onEditTextAnimation(jiken0, b) }

Я считаю, что проблема заключается в том, что значениеПараметр view - это не то, что вы ожидаете.

В версиях, где вы выполняете всю встроенную работу, вы последовательно ссылаетесь на представления, такие как jiken0, jiken1 и т. Д. Но setOnFocusChangeListener()Вызов всегда вызывается на jiken0.customEditTextBoxMain или jiken1.customEditTextBoxMain. Это означает, что значением параметра view в лямбда-выражении является представление customEditTextBoxMain, а не представление jiken0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...