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知道lowerBoundupperBound更新了?

【问题讨论】:

不确定您要实现什么目标,但直接从您的视图开始一项新活动可能不是最好的方法。我能想到的第一件事 - 您可以创建一个侦听器并将其从持有活动传递到您的视图。之后只需通过您的意图将所需的值传递给另一个活动。 我不想开始一个新的活动,我只想让当前的 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 映射修改

Android之MainActivity类

android - 向 MainActivity 发送广播,然后显示 TextView

Android开发 之MainActivity类

从 Android 的通知中打开 MainActivity

Android:在MainActivity之外创建ImageView