Android - 触发 MainActivity 从自定义视图中执行某些操作
Posted
技术标签:
【中文标题】Android - 触发 MainActivity 从自定义视图中执行某些操作【英文标题】:Android - Trigger MainActivity to do something from custom View 【发布时间】:2017-12-23 10:42:46 【问题描述】:我想让我的MainActivity
知道自定义View
有一些事情要做(例如计算东西)。 View
通过触摸检测用户输入,而 MainActivity 必须使用来自这些 View
-Values 的计算来更新某些用户控件。基本上我对onTouchEvent
做了一个覆盖:
override fun onTouchEvent(event: MotionEvent?): Boolean
val x = event?.x
val y = event?.y
val dX = x?.minus(prevX)
val dY = y?.minus(prevY)
if(dX!! > 0)
lowerBound = x.toInt()
else
upperBound = x.toInt()
prevX = x!!.toInt()
prevY = y!!.toInt()
this.invalidate() //tell view to redraw
return true
如何让MainActivity
知道lowerBound
和upperBound
更新了?
【问题讨论】:
不确定您要实现什么目标,但直接从您的视图开始一项新活动可能不是最好的方法。我能想到的第一件事 - 您可以创建一个侦听器并将其从持有活动传递到您的视图。之后只需通过您的意图将所需的值传递给另一个活动。 我不想开始一个新的活动,我只想让当前的 MainUI Acitivty 知道它必须计算东西并更新 UI 控件。 那么定义监听器有什么不好呢? 直到现在我才知道监听器 - 我会看看它。 我认为您可以简单地将边界保留为活动中的字段,并在活动中定义一个私有方法onBoundsUpdated(upperBound,lowerBound)
,并将边界与字段进行比较(如果它们已更改)并执行您想做的任何事情你的活动。
【参考方案1】:
正如 cmets 中已经推荐的那样,我将更深入地介绍“热使用监听器”。
首先,“侦听器”只不过是一个interface
,如果其他地方发生了什么事,它就会被调用。最好的例子是View.setOnClickListener(View)
。
在你的情况下如何使用它?
只需定义一个interface
(最佳位置在您的自定义视图中):
interface OnBoundsUpdatedListener
fun onBoundsUpdated(upperBound: Int, lowerBound: Int)
然后你必须在你的CustomView
中创建一个属性,并在边界发生变化时调用监听器:
// Constructor and stuff
val onBoundsUpdateListener: OnBoundsUpdatedListener? = null
override fun onTouchEvent(event: MotionEvent?): Boolean
...
onBoundsUpdateListener?.onBoundsUpdated(upperBound, lowerBound)
...
在您的Activtiy
中,您可以找到该视图并设置监听器:
val myCustomView = findViewById<MyCustomView>(R.id.id_of_your_customview)
myCustomView.onBoundsUpdateListener = object : OnBoundsUpdatedListener
override fun onBoundsUpdated(upperBound, lowerBound)
// Get called if its called in your CustomView
注意:代码可以简化。但这是基本的东西?
【讨论】:
以上是关于Android - 触发 MainActivity 从自定义视图中执行某些操作的主要内容,如果未能解决你的问题,请参考以下文章
如何在 RecyclerView 项目更改上触发 MainActivity 映射修改