创建片段的活动取决于位置:
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();
}
}
如您所见,活动创建片段取决于位置。每个片段都有特定的参数集和特定的标题。 好。这是工作。
问题是switch-case
非常大。
如何修改此代码以获得更易读的代码?
也许使用一些创作模式?例如。 Factory method
?
答案 0 :(得分:1)
你的片段都一样吗? 或者你有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:我没有测试过这段代码,但这是一般的想法
答案 1 :(得分:0)
如果确实有必要,请利用类名和字符串的顺序性。
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));
您可能需要将过滤器设置转移到各种片段中,以使其更具体。
答案 2 :(得分:0)
您可以使用abstract factory pattern,首先为每种情况定义一个所需的每个值(实例)的接口,如果需要,可以使用参数。
public abstract class FragmentFactory(){
public abstract Fragment getFragment();
public abstract Bundle getFilter();
public abstract String getTooltipText();
}
你实现每个工厂,每个片段一个,如果只有一个方法改变,这可以继承另一个工厂......这需要正确分析。
然后,您只需要一种方法来获取特定position
的工厂。
对每个实例使用List
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");
}
请注意,您只需将当前开关置于Factory.getFragment(int position)
即可。