web-dev-qa-db-ja.com

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がそこに置かれているので理にかなっています。私が望むのは、booがfalseからtrueに変更されるたびにToastが生成され、onCreate内であるかどうかに関係なくtrueからfalseになることです。つまり:

  • ボタンをクリックしてください
  • ブーをfalseからtrueに変更します
  • リスナーは変更を受け取り、onChangeにあるものを実行します。

私はボタンactionListenerを使用してこれを行うことができることを知っていますが、可能であればこれから離れたいと思いますが、現時点では不可能だと考え始めています。

どんな洞察も大歓迎です。前もって感謝します!

22
user1977217

唯一のアクセス関数もリスナーをトリップするように、変数をカスタムクラス内にラップします。そのため、スイッチを切り替える唯一の方法は、リスナーを切り替えて呼び出す関数を使用することです。

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」のコピーを渡してから、変数を変更するときに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スレッドから呼び出す必要があるため、別のスレッドで変数を変更する場合は、ルーパーを切り替える必要があります。ただし、これはおそらく発生しません。

26
Tatarize

あなたが望むものはここで答えられると思います。これは、変更されたブール値をリッスンする必要があるときに使用したものです https://stackoverflow.com/a/7157281/2258389

3
Jason