如何使用带有字符串资源的switch case

时间:2015-07-31 22:32:18

标签: java android android-fragments switch-statement

如何将开关案例场景与字符串资源而不是硬编码名称一起使用?我的字符串与用于拼写的字符完全相同。

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            MainListAdapter adapter = (MainListAdapter) parent.getAdapter();
            Main continent = adapter.getItem(position);
               if (mTwoPane) {
                    View rowView = view;
                    setItemSelected(continent, rowView);

                    Fragment newFragment;
                    switch (stringRes) {
                        case R.id.africa:
                            newFragment = new FragmentAfrica();
                            break;
                        case R.id.asia:
                            newFragment = new FragmentAsia();
                            break;
                        case R.id.europe:
                            newFragment = new FragmentEurope();
                            break;
                        default:
                            newFragment = new FragmentAfrica();
                    }

                    MainActivity activity = (MainActivity) view.getContext();
                    FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.detail_container, newFragment);
                    transaction.commit();
                } else {
              }

5 个答案:

答案 0 :(得分:3)

根据constant expressions,切换标签(this.sftpSessionFactory.setHost(host); this.sftpSessionFactory.setPort(port); this.sftpSessionFactory.setUser(user); this.sftpSessionFactory.setPassword(fetchPassword()); 中的"africa")必须为JLS § 14.12。因此,如果要使用case "africa":,则必须将字符串资源值存储在常量变量中,然后将该常量用作开关标签。

示例(使用 类常量或局部常量):

switch

答案 1 :(得分:2)

看起来这可行..使用整数。

public void switchFragments(int stringRes){
    if (mTwoPane) {
                View rowView = view;
                setItemSelected(continent, rowView);

                Fragment newFragment;
                switch (stringRes) {
                    case R.id.africa:
                        newFragment = new FragmentAfrica();
                        break;
                    case R.id.asia:
                        newFragment = new FragmentAsia();
                        break;
                    case R.id.europe:
                        newFragment = new FragmentEurope();
                        break;
                    default:
                        newFragment = new FragmentAfrica();
                }

                MainActivity activity = (MainActivity) view.getContext();
                FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.detail_container, newFragment);
                transaction.commit();
            }
}

现在你所要做的就是这样称呼它

switchFragments(R.id.africa);

这将转到标记为R.id.africa的案例并切换片段。 它也可以使用不同的语言,因为它只是一个资源的ID。

答案 2 :(得分:1)

我认为在这种情况下,最简单的方法是您可以仅使用“ simple if else语句”来避免声明额外的静态变量。并添加对区域设置更改的支持。

private String[] titles;

void initialize(){
    titles = new String[]{getString(R.string.europe),getString(R.string.africa)};
}

@Override
public Fragment getItem(int position) {

    String title = titles[position];

    if (title.equals(getString(R.string.europe))) {
        return new EuropeFragment();
    } else if (title.equals(getString(R.string.africa))) {
        return new AfricaFragment();
    } else {
        return new DefaultFragment();
    }
}

答案 3 :(得分:0)

只需将它们声明为这样的常量:

public static final String COUNTRY_AFRICA = "africa";
public static final String COUNTRY_ASIA = "asia";

switch (country.toLowerCase()) {
    case COUNTRY_AFRICA:
         newFragment = new FragmentAfrica();
         break;
    // etc..

这比硬编码更好,因为您可以在应用程序中重用这些常量。

如果这些是UI字符串,您可以在strings.xml

中声明它们

答案 4 :(得分:-2)

您应该将其声明为枚举:

public enum Continent{
    africa, asia, europe
}

public Fragment getFragment(String continentKey){
    Continent continent = Continent.valueOf(continentKey);
    return getFragment(continent);
}

public Fragment getFragment(Continent aContinent){
    Fragment newFragment;
    switch(aContinent){
        case asia:
            newFragment = new FragmentAsia();
            break;
        case europe:
            newFragment = new FragmentEurope();
            break;
        case africa: default:
            newFragment = new FragmentAfrica();
            break;
    }
    return newFragment;
}