如何在Kotlin中模拟另一个类的按钮单击

9rygscc1  于 7个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(71)

我在我的主Activity中定义了一个按钮,它将说出一个字符串值。当我单击按钮时,它会说出字符串值。我还在另一个非Activity类(Kotlin CLASS)中定义了一个广播接收器。当接收到广播时,我想在主Activity中模拟按钮单击,以便我可以说出不同的消息。我在Android Studio中使用Kotlin。
我的所有代码都可以工作。我只需要知道如何从另一个类触发主活动按钮。
我希望这是可能做到的。
我试着从非活动类调用按钮callonclick(),它使应用程序崩溃。
我可以从mainactivity类调用按钮callonclick(),它工作得很好。
因此,我所做的是从另一个类调用mainActivity类中的clickButton()函数。
在我的非活动类中,我有以下代码:

var mActivity = MainActivity()
mActivity.clickButton() // calling the onclick function in the Main act

字符串
上面的语句到达onclick函数,然后在执行btnSpeak!!.callOnClick()语句时崩溃。
下面是mainactivity类中的onclick函数

public fun clickButton() {      

   println("IN ClickButton *********************************")

   btnSpeak!!.callOnClick()  
}


当我点击mainactivity类中的按钮时,onclick函数工作正常,并说出我的消息。

wmomyfyw

wmomyfyw1#

据我所知,你想收到一个广播,一旦收到,你想点击一个按钮。
首先,您不能手动创建Activity的新示例。Activity仅由Intent触发。
但是您已经在MainActivity内部,因此您不需要导航到它或创建Activity的新示例来访问其方法。
您所需要的是:
1.创建interface

interface MyBroadcastListener {
    fun click()
}

字符串
1.在你的活动中实现它:

class MainActivity : AppCompatActivity(), MyBroadcastListener {
     ...

     override fun click() {
         btnSpeak?.callOnClick()
     }
}


1.然后,将listener作为receiver constructor参数传递:

class MyReceiver(private val listener: MyBroadcastListener) : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        listener.click()
    }
}


1.在MainActivity中,在注册接收器的地方将this作为构造函数参数传递:

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

    val receiver = MyReceiver(this)
    // TODO: register receiver
}

相关问题