2015-10-21 43 views
0

我已經移動了一些功能我與片段使用在擴展的類基類的Android - 通用枚舉<?>抽象聲明不與枚舉定義適合擴展類

protected void changeToFragment(Enum<?> label){ 
    changeToFragment(label, false); 
} 

protected void changeToFragment(Enum<?> label, boolean addToBackStack){ 
    FragmentManager fragmentManager = getFragmentManager(); 
    if (addToBackStack){ 
     fragmentManager.beginTransaction() 
       .replace(R.id.container, getFragmentFromLabel(label), label.toString()) 
       .addToBackStack(null) 
       .commit(); 

    } 
    else{ 
     fragmentManager.beginTransaction() 
       .replace(R.id.container, getFragmentFromLabel(label), label.toString()) 
       .commit(); 
    } 
} 

protected abstract Fragment getFragmentFromLabel(Enum<?> label); 

我定義一個枚舉作爲我的片段參考

private enum Fragments { FRAG_1, 
          FRAG_2, 
          FRAG_3 
         } 

,我已經實現了抽象功能

@Override 
protected Fragment getFragmentFromLabel(Fragments label){ 
    switch(label){ 
     case FRAG_1: return getFragment1(); 
     case FRAG_2: return getFragment2(); 
     case FRAG_3: return getFragment3(); 
    } 
    return null; 
} 

的問題是,我有一個錯誤說:XXX類必須是被聲明爲abstract或FragmentBaseActivity

實現抽象方法 getFragmentFromLabel(枚舉標籤)

爲什麼getFragmentFromLabel(片段標籤)不符合這一要求?

+0

將從'改變方法簽名...(片段標籤)''要...(枚舉標籤)'修復你的問題?然後將枚舉轉換爲您需要的類型? – ElliotM

+0

Yeap!它正在處理這種改變和這個投影開關((Fragments)標籤)謝謝!!但是...這種方法正在接受任何類型的枚舉,我可以限制兒童類中的方法只接受片段枚舉類型? – jmhostalet

+0

是的,我會做出回答 – ElliotM

回答

1

此錯誤是由您的方法簽名引起的。基類的抽象方法的簽名是...(Enum<?> label),所以這就是它對子類的期望。由於簽名不同,它不承認你重寫該方法。將...(Fragments label)更改爲...(Enum<?> label)將顯示您現在正在重寫抽象方法,從而修復錯誤。

這會給您帶來限制已接受的枚舉的問題。您可以通過檢查類型來完成此操作。

@Override 
protected Fragment getFragmentFromLabel(Enum<?> label){ 
if(label instanceof Fragments){ 
    switch(label){ 
    case FRAG_1: return getFragment1(); 
    case FRAG_2: return getFragment2(); 
    case FRAG_3: return getFragment3(); 
    } 
} 
return null; 
} 

有可能是一個更好的方式來做到這一點,希望這有助於

+0

多數民衆贊成在尼斯,我想知道哪裏有一種方法來獲取代碼自動補全工作在Android Studio使用此方法時,以這種方式,只有碎片枚舉被檢測到 – jmhostalet