【问题标题】:Android Studio - How can I notify an activity that a view has changed a variable?Android Studio - 如何通知活动视图已更改变量?
【发布时间】:2015-04-15 23:26:35
【问题描述】:

在 Android Studio 中,我有一个调用视图的活动。用户点击视图,视图会持续一段时间,然后结束并设置 public boolean finished = true。

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

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,但我看不到实际设置广播的方法,所以我不确定这是否可行。

【问题讨论】:

    标签: android android-activity broadcastreceiver android-view android-broadcast


    【解决方案1】:

    我相信您正在寻找的答案是here。本质上,您需要创建一个变量更改侦听器,但是该文档的作者在该主题上的研究远远超过我。

    编辑

    解决您的问题的一种方法是创建一个包装类来存储您的当前值并跟踪该值何时更改,如here 所示。

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

    然后,在您的 layout.xml 文件中,您只需要添加这个自定义视图,它就像一个常规视图,除了能够监听您的布尔值何时发生变化。

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

    【讨论】:

    • 我不太明白他的例子。他用一个未实现的方法设置了一个接口,然后从发生更改的地方对其进行更改。他如何从需要检测是否发生更改的其他类中访问它?
    • 这些都是对我的代码的巨大更改,就像发送消息一样简单。是否可以使用某种静态变量/方法来跟踪各处的变化?还不清楚为什么我需要一个包装类、一个包装类内部的接口侦听器以及一个自定义视图来完成所有这些工作。另外,当我的视图是 java 类时,我什至如何将视图放入 layout.xml 文件中??
    • “黑客”怎么样,比如有一个不可见的 0x0px 按钮并模拟点击或类似的东西?
    • 让两个类实现一个接口,该接口有一个静态变量或方法来跟踪变量如何?
    • 当然,我需要查看更多代码来提出一些有用的建议。但是,如果您想创建一个 0px 0px 按钮,您很可能只需确保将可点击属性设置为 false 并将 view.gone 设置为可见性。
    【解决方案2】:

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

    编辑:

    我们的想法是对这种模式进行一种实现。

    为监听器创建一个接口:

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

    在你的Activity中实现这个接口,valueChanged(newValue)方法会在值改变时被触发。您应该从其内部启动其他活动(或您想要针对更改的值采取的任何操作)。

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

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

    【讨论】:

    • 这个有安卓专用版本吗?到目前为止我知道的唯一一个是 BroadcastReceiver,它似乎不适合我的问题。
    • 感谢您的完整回答;试图解释这一点的所有其他帖子都有一些漏洞!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多