簡體   English   中英

Android:監聽變量變化

[英]Android: Listening for variable changes

我一直在尋找如何執行此操作的 KISS 示例,雖然它們看起來(並且我已經完成了所有操作)都很簡單。 我仍然無法理解這個概念。 我指的是自定義偵聽器(不擴展任何內容的偵聽器)...,特別是。 為 boolean 變量創建一個偵聽器,以便我可以在它的值發生變化時觸發一些方法。

這是我試過的一個例子: 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 的 state...太棒了。 問題是這只發生在 onCreate 中,這是有道理的,因為 .somethingChanged 被放置在那里。 我想要的是每次 boo 從 false 更改為 true,以及從 true 更改為 false 時生成 Toast,無論它是否在 onCreate 中。 IE:

  • 單擊一個按鈕
  • 導致 boo 從 false 變為 true
  • 偵聽器接受更改並運行 onChange 中的任何內容

我知道我可以只使用按鈕 actionListener 來執行此操作,但如果可能的話我想遠離它,目前我開始認為這是不可能的。

任何見解將不勝感激。 提前致謝!

您將變量包裝在自定義類中,這樣唯一的訪問函數也會觸發偵聽器。 因此,翻轉開關的唯一方法是通過切換和調用偵聽器的函數。

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,然后將“this”的副本傳遞給 BooVariable 類,然后當您更改變量時,它會調用 onChange。

另外,請記住,您可以內聯代碼而不是直接擴展:

BooVariable bv = new BooVariable();
bv.setListener(new BooVariable.ChangeListener() {
    @Override
    public void onChange() {
        Toast.makeText(MainActivity.this,"blah", Toast.LENGTH_LONG).show();
     }
});

附注。 Toast 必須從 UI 線程調用,因此如果要在不同的線程中更改變量,則需要切換 Looper。 不過,這可能不會出現。

現在有一個更簡單的解決方案。 只需將您的變量包裝在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
    }
});

科特林版

val listen : MutableLiveData<String> =  MutableLiveData<>()

listen.setValue("Changed value") //Initilize with a value

listen.observe(context, Observer {

    //Do something with the changed value -> it

})

我想你想要的是這里的答案。 這是我在需要監聽已更改的布爾值時使用的內容https://stackoverflow.com/a/7157281/2258389

我們可以通過使用 MutableLiveData 來實現這一點。

MutableLiveData 是可變的,是 LiveData 的子類。 在 MutableLiveData 中,我們可以使用 postValue() 和 setValue() 方法(前者是線程安全的)觀察和設置值,這樣我們就可以將值分派給任何實時或活動的觀察者。

因此,創建/轉換您需要監視的變量為MutableLiveData類型。

例如: String result; 進入MutableLiveData<String> result = new MutableLiveData<>();

您可以使用setValue()方法設置變量值,並使用getValue()方法獲取當前值。

要觀察所需變量的變化,您可以調用observe()方法並覆蓋onChanged()回調方法。

以下代碼是相同的示例,

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //MutableLiveData object creation
        MutableLiveData<String> listen = new MutableLiveData<>();
        listen.setValue("Initial value: 0");

        //Listener for listening the changes
        listen.observe(MainActivity.this,new Observer<String>() {
            @Override
            public void onChanged(String changedValue) {
                Toast.makeText(MainActivity.this, listen.getValue(),Toast.LENGTH_LONG).show();
            }
        });

        //Changing values randomly
        new CountDownTimer(30000, 3000) {
            public void onTick(long millisUntilFinished) {
                listen.setValue("Changed value: " + new Random().nextInt(61));
                TextView txtResult = findViewById(R.id.txtResult);
                txtResult.setText(listen.getValue());
            }

            public void onFinish() {
                listen.setValue("Final value: 100");
                TextView txtResult = findViewById(R.id.txtResult);
                txtResult.setText(listen.getValue());
            }
        }.start();
    }
}

在這個例子中,監聽變量是一個 MutableLiveData,我們在CountDownTimer的幫助下每 3 秒更新一次listen值。 因此,在每次更新時執行onChanged()回調,用戶將收到一條Toast消息,其中包含 listen 變量的更新值。

更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM