2

在Android Studio中,我有一个调用视图的活动。用户点击视图,视图会持续一段时间,然后完成并设置public boolean finished = true。Android Studio - 我如何通知一个活动,一个视图已经改变了一个变量?

这里是调用视图及其代码活动:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    myView = new GameLevelView(this); 
    setContentView(myView); 
} 

在视图中,我有这样的执行:

protected void onDraw(Canvas canvas) { 

    //Update canvas elements 

    if(cerainCondition == true){ 
     finished = true; 
    } 

    try { 
     Thread.sleep(10);   // Delay 
    } catch (InterruptedException e) { } 

    invalidate(); // Force a re-draw 
} 

这实质上是不断循环。但是,我希望原始活动知道该视图已设置完成= true,以便我可以开始另一个活动。我不想破坏视图,因为其他活动将显示在顶部。

我该如何去让活动知道视图已经改变了一个变量?

我已经考虑过BroadcastReceiver,但是我看不到实际设置广播的方法,所以我不确定这是否可行。

回答

1

你应该检查Observer Design Pattern,我想这就是你要找的。

编辑:

的想法是让一种实现这种模式的。

做一个接口,为听众:

public interface ValueChangeListener { public void valueChanged(boolean newValue); }

实现您的活动这个接口,valueChanged(newValue)方法将被解雇的值更改时。您应该从其内部开始其他活动(或者您想要响应更改后的值的任何操作)。

在您的ValueChangeListener类型的自定义视图中创建一个变量,并且在创建视图时,只需将Activity作为参数(它实现该接口)或创建一个方法(setValueChangeListener(ValueChangeListener listener))来传递侦听器并设置它到前面提到的变量。

在您的视图中,当您检测到值的更改时 - 只需使用该变量并调用其方法valueChanged(newValue) ...这将在您的活动中触发'onValueChanged(newValue)'。

+0

这是否有Android特定版本?目前我唯一知道的是BroadcastReceiver,它似乎不符合我的问题。 –

+0

谢谢你的完整答案;每一个试图解释这个问题的帖子都有一些漏洞! –

2

我相信你要找的答案是here。从本质上讲,你需要创建一个变量变化监听但是该文件的作者更在主题研究比我

编辑

一种方法去了解你的问题是创建一个包装类存储当前值并跟踪该值如何变化,如图所示here

为了跟踪包装类的变化,您需要创建一个自定义视图,该视图使用奖励自定义方法实现其传统构造函数,该方法将检测值更改。

然后,在你的layout.xml文件中,你只需要添加这个自定义视图,它就像一个普通的视图,除了能够监听布尔值的变化。

我建议阅读这篇文章,因为它写得很好,我希望它能回答你的问题!

+0

我不太明白他的例子。他用一个未实现的方法建立一个接口,然后从发生变化的地方改变它。他如何从需要检测变化是否已经发生的其他班级访问它? –

+0

这些都是我的代码的巨大变化,就像发送消息一样简单。是否可以使用某种静态变量/方法来跟踪各处的变化? 也不清楚为什么我需要包装类,包装类中的接口侦听器和自定义视图来完成所有这些。另外,当我的视图是一个java类时,我怎么才能在layout.xml文件中放置一个视图? –

+0

“黑客”怎么样,就像有一个不可见的0x0px按钮并模拟点击或类似的东西? –

相关问题