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.即:
我知道我可以使用按钮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)