我已将一些我使用片段的函数移动到基类
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声明为抽象或在FragmentBaseActivity中实现抽象方法 getFragmentFromLabel(枚举标签)
为什么getFragmentFromLabel(片段标签)不符合此要求?
答案 0 :(得分:1)
此错误是由您的方法签名引起的。基类&#39;抽象方法的签名是...(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;
}
可能有更好的方法来实现这一点,希望它有所帮助