Android:听取变量的变化

use*_*217 23 variables android interface listener

我一直在寻找一个如何做到这一点的KISS示例,虽然它们看起来都很简单(而且我已经完成了所有这些!),但我仍然无法理解这个概念.我指的是自定义侦听器(不扩展任何东西)...特别是,为布尔变量创建一个监听器,以便我可以在其值发生变化时引发一些方法.

这是我尝试过的一个例子: android如何使自定义变量的监听器?

如果有人有时间解释自定义监听器以及它如何以简单的英语工作,那将非常感激.我希望一旦我完全理解听众如何得到改变的通知,那么我将能够创建自己的并了解该死的东西是如何运作的.这让我头疼...提前谢谢

这是我现在所处的位置:

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);
        }
    }


}
Run Code Online (Sandbox Code Playgroud)

这是我主要活动的快照:

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();
    }


}
Run Code Online (Sandbox Code Playgroud)

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

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

我知道我可以使用按钮actionListener来做这件事,但如果可能的话我想远离这个,这一刻我开始认为是不可能的.

任何见解都会非常感激.提前致谢!

Tat*_*ize 27

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

要监视实现BooVariable.ChangeListener所需的更改,然后在BooVariable类中传递"this"的副本,然后更改它调用onChange的变量.

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

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

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


小智 24

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

爪哇版

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
    }
});
Run Code Online (Sandbox Code Playgroud)

科特林版

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

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

listen.observe(context, Observer {

    //Do something with the changed value -> it

})
Run Code Online (Sandbox Code Playgroud)