2012-01-09 71 views
3

我有一些類實現某種視覺片段。 (我稱他們爲ApetWidgets。) 他們有自己的類層次結構。開始一個活動並從一個非活動的descadent類捕獲結果

public class SignatureApetWidget extends AbstractApetWidget { 

    private void startCapture(ApetActivity act) { 
     Intent intent = new Intent(act, SignatureCaptureActivity.class); 
     intent.putExtra(...); 

     act.startActivityForResult(intent, CAPTURE_SIGNATURE_REQUEST); 
    } 

其中一個應該開始另一個Activity並等待結果。但是,儘管我有對包含小部件的活動的引用,儘管我可以調用parentActivity的startActivityForResult,但我無法攔截結果,因爲這也會導致父活動。

我可以通過它捕獲結果,並將處理委託給我的窗口小部件,但這似乎是一種不好的做法,因爲我必須將窗口小部件特定的邏輯從窗口小部件移動到活動,更重要的是:我會必須在我計劃使用小部件的所有活動類中實施此委派)。

我知道如何(至少我知道一種方式)開始其他活動。 (它工作正常。)但是,我沒有從它得到任何結果。 擴展並繼承自Activity或任何其他類不是一個選項(我的小部件具有自己的類層次結構)。

所以我的問題是:我怎麼能從一個非活動類中的結果開始一個活動,而不會嚴重推斷封裝子句?

感謝, 巴拉熱

回答

2

我認爲這樣做是使用一個接口和聽衆的最佳途徑。如果你使用片段http://developer.android.com/guide/topics/fundamentals/fragments.html作爲你的父類,你不需要這樣做,這就是谷歌創建它們的原因。

基本上,當您的活動觸發onActivityResult(int requestCode,int resultCode,Intent數據)時,您應該在ApetWidgets中調用正確的函數。您不必在活動中添加任何特定的代碼,然後將信息傳遞給您的小部件。再一次,如果使用Fragment,則所有的活動生命週期方法都已經委派並可以覆蓋。

+0

謝謝你的回答,片段將是完美的工具,但我無法使用它:我必須成爲API級別7的complient,它被引入到級別11中。(另一個原因是個人的:它需要一個很多重構在當前的開發狀態中移動到碎片。) 但是,我想感謝您指出了這一新功能! – Balage1551 2012-01-09 23:06:49

+1

不正確,作爲android SDK下載的一部分存在兼容性庫。這將讓你支持所有的方式回到1.6,看看這個鏈接:http://developer.android.com/sdk/compatibility-library.html通過包括這個jar你可以使用Fragment API,我使用它,它的工作原理大。此外:http://android-developers.blogspot.com/2011/03/fragments-for-all.html – sgarman 2012-01-09 23:15:58

0

我用這樣的結構。首先 - 在你的小部件中實現回調方法。其次 - 將意圖鏈接到您的小部件。第三 - 從您的活動調用小部件回調方法。

順便說一句 - 它聽起來像你有你的代碼設計的問題。如果你想從secod Activity得到一些依賴用戶的結果,那麼在Activity類中處理結果是比較好的方式,而不是widget。

+0

謝謝,它可以工作。它感覺有點緊密的耦合,但可能不是真正的問題,因爲第二個活動在回調之後關閉。而且還需要一些謹慎的設計和反向緩存,因爲回調將在恢復調用者活動(包含小部件)之前調用。 – Balage1551 2012-01-09 23:10:16