Java 开关箱太大了
创建片段的活动取决于位置:Java 开关箱太大了,java,android,Java,Android,创建片段的活动取决于位置: private void displayView(int position) { try { Fragment currentFragment = null; Bundle args = new Bundle(); Bundle filter = new Bundle(); args.putBundle(Fra
private void displayView(int position) {
try {
Fragment currentFragment = null;
Bundle args = new Bundle();
Bundle filter = new Bundle();
args.putBundle(FragmentSort.FILTER, filter);
switch (position) {
case 1:
currentFragment = Fragment.instantiate(this, Fragment_A.class.getName());
toolbaTitleTextView.setText(getString(R.string.title_AA));
filter.putBoolean(Offer.FAVORITE, true);
break;
case 2:
currentFragment = Fragment.instantiate(this, Fragment_Z.class.getName());
toolbaTitleTextView.setText(getString(R.string.title_XX));
break;
...
case 20:
currentFragment = Fragment.instantiate(this, Fragment_X.class.getName());
toolbaTitleTextView.setText(getString(R.string.title_BBB));
filter.putBoolean(Offer.DOWNLOADED, true);
break;
default:
break;
}
if (currentFragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
currentFragment.setArguments(args);
fragmentManager.beginTransaction().replace(R.id.fragmentsContainer, currentFragment).commit();
} else {
Debug.e(TAG, "displayView: Error in creating fragment");
}
} finally {
drawerLayout.closeDrawers();
}
}
如您所见,活动创建片段取决于位置。每个片段都有一组特定的参数和特定的标题。
好啊这是工作
问题是开关箱
很大
如何修改此代码以获得更可读的代码
也许使用一些创作模式?例如,
工厂方法
?你的片段都是一样的吗?
或者你有20种不同的碎片
对于我的第一个问题,如果是:
您应该在类中创建一个片段列表,而不是使用开关大小写,您只需在当前位置抓住列表中的项并进行处理,如下所示:
Fragment currentFragment = YOURLISTOFFRAGMENTS.get(position);
Bundle args = new Bundle();
Bundle filter = new Bundle();
args.putBundle(FragmentSort.FILTER, filter);
...
如果我的第一个问题是否,第二个问题是是,您应该以更复杂的方式执行,您的所有片段都应该实现一个接口,该接口将有一个方法,此方法实现可能会因每个片段而改变,但应该具有相同的参数和返回。然后回到类中,您将按照接口声明的方式处理所有片段。像这样
public interface HandleName{
String print()
}
public class MyFrag1 implements HandleName{
@Override
public String print(){
return "MyFrag1"
}
}
public class MyFrag2 implements HandleName{
@Override
public String print(){
return "MyFrag2"
}
}
回到你的课堂上,你应该这样做
HandleName interfaceNamedFragment = YOURLISTOFFRAGMENTS.get(position);
interfaceNamedFragment.print()
PS:我还没有测试过这段代码,但这是总体思路如果确实有必要,请利用类名和字符串的顺序性质
String fragmentString = "Fragment_"+position;
currentFragment = Fragment.instantiate(this, fragmentString);
供字符串使用
String resourceString = "title_"+position;
int resourceId = this.getResources().getIdentifier(resourceString, "string", this.getPackageName());
toolbaTitleTextView.setText(getString(resourceId));
您可能需要将过滤器设置转换到各个片段中,使其更加具体。您可以使用,首先定义一个包含每个案例所需的每个值(实例)的接口,如果需要,它可以使用参数
public abstract class FragmentFactory(){
public abstract Fragment getFragment();
public abstract Bundle getFilter();
public abstract String getTooltipText();
}
您实现了每个工厂,每个片段一个,如果只有一个方法更改,这可以继承另一个工厂。。。这需要进行适当的分析
然后,您只需要一种方法来获取特定位置的工厂
对每个实例使用列表
public static FragmentFactory getFragment(int position){
return listFactory.get(position);
}
或者用一个好的旧开关
public static FragmentFactory getFragment(int position){
switch(position){
case 1:
return Factory1;
case 2:
return Factory2;
...
default:
throw new IllegalArgument("No Fragment defined for that position");
}
请注意,只需将当前开关置于工厂.getFragment(int位置)
中即可 使用实例而不是创建20个不同的类?@Zoe post作为答案。我建议你研究策略模式,而不是没有更多的代码@IntelliJAmiya。如果这些片段的内容是20个不同的片段,这是不可行的。如果/直到OP发布更多的代码(到了可以写出一个像样答案的程度),我will@guisantogui“战略模式”是一种行为模式。但我想我需要一个创作模式。我说得对吗?很详细。我认为这不是一个更容易的解决方案,而是设计过度,进一步增加了编码工作量。@ir2pid模式不仅使问题变得更容易,而且为您提供了更易于维护的代码。使用带有多态性的定义代码更易于调试。当然,这是一个5分钟的解决方案……我宁愿使用枚举,也不希望片段在某一点上不被重构。这可能只会导致类名出现意外问题。