开关盒太大了

时间:2017-11-22 16:46:24

标签: java android

创建片段的活动取决于位置:

    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

3 个答案:

答案 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)即可。