2012-09-12 41 views
0

我修復了大的android應用程序,我有許多自定義的對話框,它們繼承了各種類型的標準android對話框(AlertDialog,ProgressDialog,...)。爲整個項目設置對話框屬性(對於很多自定義對話框)

我要補充選項「setCanceledOnTouchOutside(假)」在應用中的所有對話,因爲在ICS我們有這個選項默認情況下,真正的設置android 4.0 Dialog gets canceled when touched outside of dialog window

,我可以添加一行「* dialog.setCanceledOnTouchOutside(假) 「對於我的項目中的每一個對話,但這很難維持解決方案。

我不能從繼承自Dialog的MyDialog繼承,因爲我繼承了AlertDialog,ProgressDialog ......。

也許最好的解決方案是將整個項目的所有對話框選項設置在一個地方,或者做出任何黑客,從默認的行爲從舊的Android版本比ICS,但我不知道是否有可能以及如何做這個?

你能告訴我嗎?

回答

1

擁有所有的對話實現共同的接口,這樣,

interface DialogSettings { 
    void setCancelOnTouchOutside(boolean cancel); 
} 

現在實行的這種單機版,

class VersionAwareDialogSettings implements DialogSettings { 
    private final Dialog d; 

    DialogSettingsImpl(Dialog d) { 
     this.d = d; 
    } 

    @Override 
    void setCancelOnTouchOutside(boolean cancel) { 
     if (Build.Version.SDK_INT ...) { 
     d.setCancelOnTouchOutside(cancel); 
     } 
    } 
} 
現在

,在所有的對話框類,實現這個接口,像這樣,

class MyDialog extends AlertDialog implement DialogSettings { 
... 
    @Override 
    public void setCancelOnTouchOutside(boolean cancel) { 
    new VersionAwareDialogSettings(this).setCancelOnTouchOutside(cancel); 
    } 
} 

這看起來像是一大堆cruft,但它是一個很好的獨立關注的配給。如果您想添加版本感知對話框設置,請更改界面,並且需要修改的代碼的所有部分都會被標記。如果您需要更改verison感知對話設置的impl,只需在一個地方更改它即可:VersionAwareDialogSettings

你應該更關心編寫正確的代碼,而不是試圖減少你寫的行數。我不瞭解你,但我可以打字得比我想象的快得多。我的大腦是瓶頸。

+0

我需要所有的Android版本相同bahaviour:'setCancelOnTouchOutside(假)' 但默認情況下對ICS是'setCancelOnTouchOutside(真)'和較低的版本是'setCancelOnTouchOutside(假)' 我認爲您的解決方案對版本上的不同實現非常適合,但對於我的情況太複雜了,不是嗎? – qbait