Android - 如何将函数传递给 Activity?
Android - How to pass a function to an Activity?
我正在尝试为 activity 创建一个生成器。原因是因为这个 activity 可以通过多种不同的方式启动。我像这样创建了一个生成器 class:
class ActivityBuilder {
private var showToolBar = false
private var postExecutable: (() -> Unit)? = null
fun showToolbar(boolean: Boolean) : ActivityBuilder {
this.showToolBar = boolean
return this
}
fun setPostExecutable(function: () -> Unit) : ActivityBuilder {
this.postExecute = function
return this
}
fun start(context: Context){
val intent = Intent(context, Activity::class.java)
context.startActivity(intent)
}
}
我们的想法是调用类似这样的东西并访问 activity 中的这些字段。
ActivityBuilder().showToolbar(false).setPostExecutable { { doSomething() } }.start(this)
我想我也可以使用一个伴生对象,它可以达到同样的目的。
companion object Builder {
private var showToolBar = false
private var postExecute: (() -> Unit)? = null
fun showToolbar(boolean: Boolean) : Builder {
this.showToolBar = boolean
return this
}
fun setPostExecutable(function: () -> Unit) : Builder {
this.postExecute = function
return this
}
fun start(context: Context){
val intent = Intent(context, AuthActivity::class.java)
context.startActivity(intent)
}
}
问题主要来自 "postExecutable" 字段。我需要在某个点调用该函数,但它不可打包,所以我无法在启动时通过意图传递它 activity.
如果有人有解决方案,我不胜感激!
这是我找到的一个解决方案,可能不是最优雅的。我使用父上下文创建了一个广播接收器,它与我的 activity 同时启动。
class ActivityBuilder(private val context: Context) {
private var postSuccessExecutable: (() -> Unit)? = null
...
private fun setupReceiver(){
val filter = IntentFilter()
filter.addAction("SUCCESS")
val receiver = object : BroadcastReceiver() {
override fun onReceive(c: Context?, intent: Intent?) {
context.unregisterReceiver(this)
if (intent?.action == "SUCCESS"){
Toast.makeText(context, "Successful", Toast.LENGTH_SHORT).show()
postSuccessExecutable?.invoke()
}
}
}
context.registerReceiver(authReceiver, filter)
}
...
}
当我要触发该功能时,我只是发送一个广播:
private fun sendSuccessBroadcast(data: String){
val intent = Intent()
intent.action = "SUCCESS"
intent.putExtra("data", String)
requireContext().sendBroadcast(intent)
}
我正在尝试为 activity 创建一个生成器。原因是因为这个 activity 可以通过多种不同的方式启动。我像这样创建了一个生成器 class:
class ActivityBuilder {
private var showToolBar = false
private var postExecutable: (() -> Unit)? = null
fun showToolbar(boolean: Boolean) : ActivityBuilder {
this.showToolBar = boolean
return this
}
fun setPostExecutable(function: () -> Unit) : ActivityBuilder {
this.postExecute = function
return this
}
fun start(context: Context){
val intent = Intent(context, Activity::class.java)
context.startActivity(intent)
}
}
我们的想法是调用类似这样的东西并访问 activity 中的这些字段。
ActivityBuilder().showToolbar(false).setPostExecutable { { doSomething() } }.start(this)
我想我也可以使用一个伴生对象,它可以达到同样的目的。
companion object Builder {
private var showToolBar = false
private var postExecute: (() -> Unit)? = null
fun showToolbar(boolean: Boolean) : Builder {
this.showToolBar = boolean
return this
}
fun setPostExecutable(function: () -> Unit) : Builder {
this.postExecute = function
return this
}
fun start(context: Context){
val intent = Intent(context, AuthActivity::class.java)
context.startActivity(intent)
}
}
问题主要来自 "postExecutable" 字段。我需要在某个点调用该函数,但它不可打包,所以我无法在启动时通过意图传递它 activity.
如果有人有解决方案,我不胜感激!
这是我找到的一个解决方案,可能不是最优雅的。我使用父上下文创建了一个广播接收器,它与我的 activity 同时启动。
class ActivityBuilder(private val context: Context) {
private var postSuccessExecutable: (() -> Unit)? = null
...
private fun setupReceiver(){
val filter = IntentFilter()
filter.addAction("SUCCESS")
val receiver = object : BroadcastReceiver() {
override fun onReceive(c: Context?, intent: Intent?) {
context.unregisterReceiver(this)
if (intent?.action == "SUCCESS"){
Toast.makeText(context, "Successful", Toast.LENGTH_SHORT).show()
postSuccessExecutable?.invoke()
}
}
}
context.registerReceiver(authReceiver, filter)
}
...
}
当我要触发该功能时,我只是发送一个广播:
private fun sendSuccessBroadcast(data: String){
val intent = Intent()
intent.action = "SUCCESS"
intent.putExtra("data", String)
requireContext().sendBroadcast(intent)
}