39

私はこれを行う方法の 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 は boo... great の状態を表示します。問題は、これが onCreate 内でのみ発生することです。これは、.somethingChanged がそこに配置されているため意味があります。私が望むのは、onCreate 内にあるかどうかに関係なく、boo が false から true に、true から false に変更されるたびに Toast が生成されることです。すなわち:

  • ボタンをクリック
  • boo を false から true に変更します。
  • リスナーは変更を検出し、onChange にあるものをすべて実行します

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

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

4

2 に答える 2

40

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

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 スレッドから呼び出す必要があるため、別のスレッドで変数を変更する場合は Looper を切り替える必要があります。しかし、これはおそらく出てこないでしょう。

于 2016-08-18T00:41:35.963 に答える