我一直在寻找一个如何做到这一点的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。即:
我知道我可以使用按钮actionListener来做到这一点,但如果可能的话,我想远离这个,我现在开始认为这是不可能的。
非常感谢任何见解。提前谢谢!
答案 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