Android: прослушивание переменных изменений
Я искал пример 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);
}
}
}
Это снимок моей основной деятельности:
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 отображает состояние boo... отлично. Проблема в том, что это происходит только внутри onCreate, что имеет смысл, так как там помещается .somethingChanged. Я хотел бы, чтобы Toast генерировался каждый раз, когда boo изменен с false на true и true на false, независимо от того, находится ли он внутри onCreate или нет. То есть:
- Нажмите кнопку
- Приводит boo к изменению с false на true
- Слушатель выбирает изменения и запускает все, что находится в onChange
Я знаю, что могу просто использовать кнопку actionListener, чтобы сделать это, но я хотел бы держаться подальше от этого, если это возможно, что на момент, когда я начинаю думать, невозможно.
Любое понимание было бы очень оценено. Спасибо заранее!
Ответы
Ответ 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, а затем передать классу BooVariable копию "this", а затем, когда вы измените переменную, которую она вызывает, измените.
Кроме того, имея в виду, вы можете просто вставить код, а не напрямую:
BooVariable bv = new BooVariable();
bv.setListener(new BooVariable.ChangeListener() {
@Override
public void onChange() {
Toast.makeText(MainActivity.this,"blah", Toast.LENGTH_LONG).show();
}
});
PS. Тост должен быть вызван из потока пользовательского интерфейса, поэтому вам нужно переключить Looper, если вы собираетесь изменить переменную в другом потоке. Вероятно, это не произойдет.
Ответ 2
Я думаю, что на что вы хотите ответить. Это то, что я использовал, когда мне нужно было прослушивать логическое значение, которое было изменено fooobar.com/info/199349/...