Android: прослушивание переменных изменений - программирование
Подтвердить что ты не робот

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, чтобы сделать это, но я хотел бы держаться подальше от этого, если это возможно, что на момент, когда я начинаю думать, невозможно.

Любое понимание было бы очень оценено. Спасибо заранее!

4b9b3361

Ответ 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/...