Kotlin OnClick听众

时间:2018-06-15 10:52:39

标签: android kotlin

我正在尝试从MainActivity中定义的UI获取Toast,并在onClick Listener的Base Activity中编写代码。根据要求,我已经将我的基类定义为开放但仍然没有得到Toast

这是代码

BaseActivity

    open class BaseActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val buttonClick= findViewById<Button>(R.id.button)
        buttonClick?.setOnClickListener {
            Toast.makeText(this@BaseActivity, "Click...", Toast.LENGTH_LONG).show()
        }

    }
}

MainActivity

    class MainActivity : BaseActivity() {

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

activity_main.xml中

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

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="18dp"
        android:layout_marginBottom="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:text="Hello World!"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.409" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="190dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />


</android.support.constraint.ConstraintLayout>

你能说出代码有什么问题吗?我怎么能从中获得点击

5 个答案:

答案 0 :(得分:2)

我认为这里的问题是您在val buttonClick= findViewById<Button>(R.id.button)中呼叫BaseActivity.onCreate,在MainActivity.onCreate 之前呼叫 您呼叫setContentView ...所以视图尚未初始化,并且您没有订阅点击事件。

您可以在onClickListener附加MainActivity,或者如果您仍希望在BaseActivity中添加initViews,则可以制作其他setContentView方法并在{{1}后调用}}:

class MainActivity : BaseActivity() {

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

        initViews()
    }
}



open class BaseActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    } 

    protected fun initViews() {
        val buttonClick= findViewById<Button>(R.id.button)
        buttonClick?.setOnClickListener {
            Toast.makeText(this@BaseActivity, "Click...", Toast.LENGTH_LONG).show()
        }
    }    
}

答案 1 :(得分:1)

您需要在MainActivity

中移动听众的代码

<强> MainActivity.kt

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

            val buttonClick= findViewById<Button>(R.id.button)
            buttonClick?.setOnClickListener {
                Toast.makeText(this@MainActivity, "Click...", Toast.LENGTH_LONG).show()
            }

    }

因为你在BaseActivity的onCreate中定义了你的监听器,所以findViewById<Button>(R.id.button)实际上是空的,因为setContentView(R.layout.activity_main)被调用了。

答案 2 :(得分:0)

在您的代码中,只有在您尝试将侦听器设置为不存在的视图后才会调用setContentView

一种可能的解决方案是在调用尝试设置内容视图的抽象方法后,只尝试添加单击侦听器(不带?。)。

abstract class BaseActivity: AppCompatActivity() {
    abstract val layoutId: Int

    override fun onCreate(bundle: Bundle?) {
         super.onCreate(bundle)
         setContentView(layoutId) 
         button.setOnClickListener {
            ... 

答案 3 :(得分:-1)

问题是你试图在BaseActivity类中访问你的按钮,而你的布局只在MainActivity内加载。因此无法找到该按钮。解决方案是:

abstract class BaseActivity : AppCompatActivity() {

   abstract val buttonClick: Button

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

       buttonClick.setOnClickListener {
           Toast.makeText(this@BaseActivity, "Click...", Toast.LENGTH_LONG).show()
    }
  }
}

class MainActivity : BaseActivity() {
   override val buttonClick: Button
        get() = button // Kotlin view binding

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

做了什么:我们定义了一个抽象按钮并为其分配了一个点击监听器。因此,点击处理的逻辑保留在基本活动中,而MainActivity只是定义了一个视图(R.id.button,通过kotlin视图绑定)来操作。

答案 4 :(得分:-1)

使用它 Toast.makeText(getApplicationContext(), "Click " , Toast.LENGTH_LONG).show();