[英]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:
我知道我可以只使用按鈕 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.