Android:监听变量变化

新手上路,请多包涵

我一直在寻找如何执行此操作的 KISS 示例,虽然它们看起来都很简单(而且我已经全部完成了!),但我仍然无法理解这个概念。我指的是自定义侦听器(不扩展任何内容的侦听器)…特别是为布尔变量创建侦听器,以便我可以在其值更改时触发一些方法。

这是我试过的一个例子: android how to make listener to a custom variable?

如果有人有时间用简单的英语解释自定义侦听器及其工作原理,将不胜感激。我希望一旦我确切地了解了如何向侦听器通知更改,那么我将能够创建自己的并了解该死的东西是如何工作的。这让我很头疼……提前致谢

这是我现在所在的位置:

 public class ChangeListener {
    boolean boo = false;

    public ChangeListener(boolean b){
        boo = b;
    }

    private listener l = null;

    public interface listener{
        public void onChange(boolean b);
    }

    public void setChangeListener(listener mListener){
        l = mListener;
    }

    public void somethingChanged(){
        if(l != null){
            l.onChange(boo);
        }
    }

}

这是我的主要活动的快照:

 public class Main extends Activity implements ChangeListener.listener{
    private ChangeListener listener;
    private boolean boo = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        listener = new ChangeListener(boo);
        listener.setChangeListener(this);
        listener.somethingChanged();

    }

    @Override
    public void onChange(boolean b) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "REST = "+b, Toast.LENGTH_SHORT).show();
    }

}

现在,当 Activity 开始时,Toast 会显示 boo… 太棒了。问题是这只发生在 onCreate 中,这是有道理的,因为 .somethingChanged 被放置在那里。我想要的是每次 boo 从 false 变为 true,true 变为 false 时生成 Toast,无论它是否在 onCreate 内。 IE:

  • 单击一个按钮
  • 导致 boo 从 false 变为 true
  • 侦听器接受更改并运行 onChange 中的任何内容

我知道我可以只使用按钮 actionListener 来执行此操作,但如果可能的话我想远离它,目前我开始认为这是不可能的。

任何见解将不胜感激。提前致谢!

原文由 user1977217 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 952
1 个回答

您将变量包装在自定义类中,这样唯一的访问函数也会触发侦听器。因此,翻转开关的唯一方法是通过切换和调用侦听器的功能。

 public class BooVariable {
    private boolean boo = false;
    private ChangeListener listener;

    public boolean isBoo() {
        return boo;
    }

    public void setBoo(boolean boo) {
        this.boo = boo;
        if (listener != null) listener.onChange();
    }

    public ChangeListener getListener() {
        return listener;
    }

    public void setListener(ChangeListener listener) {
        this.listener = listener;
    }

    public interface ChangeListener {
        void onChange();
    }
}

要监视更改,您需要实现 BooVariable.ChangeListener,然后将“this”的副本传递给 BooVariable 类,然后,当您更改变量时,它会调用 onChange。

另外,请记住,您可以直接内联代码而不是直接扩展:

 BooVariable bv = new BooVariable();
bv.setListener(new BooVariable.ChangeListener() {
    @Override
    public void onChange() {
        Toast.makeText(MainActivity.this,"blah", Toast.LENGTH_LONG).show();
     }
});

附言。 toast 必须从 UI 线程调用,因此如果要在不同的线程中更改变量,则需要切换 Looper。不过,这可能不会出现。

原文由 Tatarize 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题