2

在Android Studio中,我有一個調用視圖的活動。用戶點擊視圖,視圖會持續一段時間,然後完成並設置public boolean finished = true。Android Studio - 我如何通知一個活動,一個視圖已經改變了一個變量?

這裏是調用視圖及其代碼活動:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    myView = new GameLevelView(this); 
    setContentView(myView); 
} 

在視圖中,我有這樣的執行:

protected void onDraw(Canvas canvas) { 

    //Update canvas elements 

    if(cerainCondition == true){ 
     finished = true; 
    } 

    try { 
     Thread.sleep(10);   // Delay 
    } catch (InterruptedException e) { } 

    invalidate(); // Force a re-draw 
} 

這實質上是不斷循環。但是,我希望原始活動知道該視圖已設置完成= true,以便我可以開始另一個活動。我不想破壞視圖,因爲其他活動將顯示在頂部。

我該如何去讓活動知道視圖已經改變了一個變量?

我已經考慮過BroadcastReceiver,但是我看不到實際設置廣播的方法,所以我不確定這是否可行。

回答

1

你應該檢查Observer Design Pattern,我想這就是你要找的。

編輯:

的想法是讓一種實現這種模式的。

做一個接口,爲聽衆:

public interface ValueChangeListener { public void valueChanged(boolean newValue); }

實現您的活動這個接口,valueChanged(newValue)方法將被解僱的值更改時。您應該從其內部開始其他活動(或者您想要響應更改後的值的任何操作)。

在您的ValueChangeListener類型的自定義視圖中創建一個變量,並且在創建視圖時,只需將Activity作爲參數(它實現該接口)或創建一個方法(setValueChangeListener(ValueChangeListener listener))來傳遞偵聽器並設置它到前面提到的變量。

在您的視圖中,當您檢測到值的更改時 - 只需使用該變量並調用其方法valueChanged(newValue) ...這將在您的活動中觸發'onValueChanged(newValue)'。

+0

這是否有Android特定版本?目前我唯一知道的是BroadcastReceiver,它似乎不符合我的問題。 –

+0

謝謝你的完整答案;每一個試圖解釋這個問題的帖子都有一些漏洞! –

2

我相信你要找的答案是here。從本質上講,你需要創建一個變量變化監聽但是該文件的作者更在主題研究比我

編輯

一種方法去了解你的問題是創建一個包裝類存儲當前值並跟蹤該值如何變化,如圖所示here

爲了跟蹤包裝類的變化,您需要創建一個自定義視圖,該視圖使用獎勵自定義方法實現其傳統構造函數,該方法將檢測值更改。

然後,在你的layout.xml文件中,你只需要添加這個自定義視圖,它就像一個普通的視圖,除了能夠監聽布爾值的變化。

我建議閱讀這篇文章,因爲它寫得很好,我希望它能回答你的問題!

+0

我不太明白他的例子。他用一個未實現的方法建立一個接口,然後從發生變化的地方改變它。他如何從需要檢測變化是否已經發生的其他班級訪問它? –

+0

這些都是我的代碼的巨大變化,就像發送消息一樣簡單。是否可以使用某種靜態變量/方法來跟蹤各處的變化? 也不清楚爲什麼我需要包裝類,包裝類中的接口偵聽器和自定義視圖來完成所有這些。另外,當我的視圖是一個java類時,我怎麼才能在layout.xml文件中放置一個視圖? –

+0

「黑客」怎麼樣,就像有一個不可見的0x0px按鈕並模擬點擊或類似的東西? –

相關問題