Android Kotlin не может изменить текстовую строку в функции

#android #android-layout #kotlin

#Android #android-layout #kotlin

Вопрос:

У меня есть действительно простой код Kotlin для изменения текстовой строки в функции, сгенерированной нажатием кнопки, но он не работает. У меня есть одна кнопка и две текстовые строки, при нажатии одной кнопки первая текстовая строка изменяется, но текстовая строка внутри функции не изменяется.

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

MainActivty.kt

 package com.example.sandpit9

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import org.w3c.dom.Text

class MainActivity : AppCompatActivity() {

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

        imageButton1.setOnClickListener {v: View -> toast(v) }

        imageButton1.setOnClickListener {
            imageButton1.setImageResource(R.drawable.greenbutton)
            textView1.text = "1234"
        }
    }

    public fun toast(v: View) {
        v.textView2.text = "1234"
    }
}
  

MainActivty.xml

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@ id/textView1"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@ id/imageButton1"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp"
        android:textSize="34sp"/>
<TextView
        android:text="textvar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@ id/textView2"
        android:textSize="34sp"
        android:layout_marginTop="108dp"
        app:layout_constraintTop_toBottomOf="@ id/imageButton1"
        android:layout_marginEnd="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginLeft="8dp"
        app:layout_constraintHorizontal_bias="0.535"/>
<ImageButton
        android:layout_width="174dp"
        android:layout_height="154dp"
        app:srcCompat="@drawable/download"
        android:id="@ id/imageButton1"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.542"
        app:layout_constraintVertical_bias="0.187"/>

</android.support.constraint.ConstraintLayout>
  

Ответ №1:

Вы перезаписываете прослушиватель кликов. OnClickListener Это единственное свойство, а не список.

 imageButton1.setOnClickListener {v: View -> 
  toast(v)
  imageButton1.setImageResource(R.drawable.greenbutton)
  textView1.text = "1234"
}


  

Ответ №2:

 imageButton1.setOnClickListener {v: View -> toast(v) }

imageButton1.setOnClickListener {
    imageButton1.setImageResource(R.drawable.greenbutton)
    textView1.text = "1234"
}
  

Проблема: ImageButton есть только один OnClickListener , который прослушивает событие, когда на нем есть событие щелчка. Вы можете установить прослушиватель с помощью setOnClickListener . Потому что в вашем коде вы используете setOnClickListener два раза, поэтому второй переопределит первый.

Решение: измените свой код на

 class MainActivity : AppCompatActivity() {

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

        imageButton1.setOnClickListener {
            imageButton1.setImageResource(R.drawable.greenbutton)
            textView1.text = "1234"
            textView2.text = "1234"
        }
    }
}
  

Ответ №3:

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

 package com.example.sandpit9

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import org.w3c.dom.Text

class MainActivity : AppCompatActivity() {

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

    imageButton1.setOnClickListener{v: View -> toast(v)}

    }



private fun toast(v: View) {
    imageButton1.setImageResource(R.drawable.greenbutton)
    textView1.text = "1234"
    textView2.text = "1234"



}

}
  

Ответ №4:

удалите этот импорт

 import kotlinx.android.synthetic.main.activity_main.view.*
  

Надеюсь, это сработает

Комментарии:

1. @GiorgosNeokleous Удаление импорта не устранит проблему. Но все же стоит отметить, что импортировать что-либо с .* помощью не предлагается.

2. @theThapa Спасибо, что указали. Я знаю, что это не рекомендуется. Лично я не большой поклонник синтетики kotlin. Однако, если это был ответ, должна быть причина, объясняющая, почему.

3. @GiorgosNeokleous я согласен с вами. Если удаление этого импорта является ответом, было бы неплохо получить некоторое объяснение.