Android:听取变量的变化

时间:2013-01-22 11:40:31

标签: android variables interface listener

我一直在寻找一个如何做到这一点的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();
    }


}

现在,当活动开始时,Toast显示出嘘声的状态......很棒。问题是这只发生在onCreate中,这有意义,因为.somethingChanged放在那里。我想要的是每次boo从false变为true时生成Toast,并且无论是否在onCreate内,都为true。即:

  • 点击按钮
  • 使boo从false更改为true
  • 侦听员接受更改并运行onChange中的任何内容

我知道我可以使用按钮actionListener来做到这一点,但如果可能的话,我想远离这个,我现在开始认为这是不可能的。

非常感谢任何见解。提前谢谢!

3 个答案:

答案 0 :(得分:23)

将变量包装在自定义类中,以便唯一的访问函数也会使侦听器跳闸。因此,翻转开关的唯一方法是通过切换和调用监听器的功能。

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所需的更改,然后将BooVariable类的副本传递给"这个"然后,当你更改变量时,它调用onChange。

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

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

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

答案 1 :(得分:17)

现在有一个更简单的解决方案。只需将变量包装在LiveData特别是MutableLiveData中即可。

Java版本

MutableLiveData<String> listen = new MutableLiveData<>();

listen.setValue("Changed value"); //Initilize with a value

listen.observe(context,new Observer<String>() {
    @Override
    public void onChanged(String changedValue) {
        //Do something with the changed value
    }
});

科林版

val listen : MutableLiveData<String> =  MutableLiveData<>()

listen.setValue("Changed value") //Initilize with a value

listen.observe(context, Observer {

    //Do something with the changed value -> it

})

答案 2 :(得分:3)

我想你想要的是这里的答案。这是我在需要监听已更改的布尔值时使用的https://stackoverflow.com/a/7157281/2258389