Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将switch case与字符串资源一起使用_Java_Android_Android Fragments_Switch Statement - Fatal编程技术网

Java 如何将switch case与字符串资源一起使用

Java 如何将switch case与字符串资源一起使用,java,android,android-fragments,switch-statement,Java,Android,Android Fragments,Switch Statement,如何使用字符串资源而不是硬编码名称的开关大小写方案?我的字符串与拼写它们时使用的名称完全相同 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { MainListAdapter adapter = (MainListAdapter) parent.getAdapter();

如何使用字符串资源而不是硬编码名称的开关大小写方案?我的字符串与拼写它们时使用的名称完全相同

        @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 {
              }
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
MainListAdapter=(MainListAdapter)parent.getAdapter();
主大陆=适配器.getItem(位置);
如果(mTwoPane){
视图行视图=视图;
setItemSelected(大陆,行视图);
新片段;
开关(stringRes){
案例R.id.非洲:
newFragment=newfragmentAfrica();
打破
案例R.id.asia:
newFragment=newfragmentAsia();
打破
案例R.id.欧洲:
newFragment=newfragmentEurope();
打破
违约:
newFragment=newfragmentAfrica();
}
MainActivity=(MainActivity)view.getContext();
FragmentTransaction=activity.getSupportFragmentManager().beginTransaction();
事务.替换(R.id.detail\u容器,newFragment);
commit();
}否则{
}

只需将它们声明为常量,如下所示:

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

开关标签中声明它们(这是
案例“africa”中的
“africa”
):必须符合。因此,如果要使用
开关
,必须将字符串资源值存储在常量变量中,然后将该常量用作开关标签

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


您应该将其声明为枚举:

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;
}

看起来这可能有用..使用整数

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。

我认为在这种情况下,最简单的方法是使用“简单的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();
    }
}

请记住,我的应用程序将使用不同的语言。您已经硬编码了“非洲”和“亚洲”。我不能使用
getResources().getString(R.string.africa)
getResources().getString(R.string.asia)
吗?我还没有测试过这个,但也许您可以使用字符串资源id?然后您可以使用带有整数的开关。是“非洲”吗UI字符串?我的意思是,它是否显示给用户?如果是,则逻辑错误。您不应该根据随localeSo更改的字符串生成条件,不要使用
getResources().getString()
在一个切换案例中。继续@ChrisKo提出的解决方案。或者我的解决方案:)他们实际上做了相同的事情。请记住,我的应用程序将使用不同的语言。例如,法国人不说“Africa”,他们说“Afrique”我不能使用
getResources().getString(R.string.Africa)
getResources().getString(R.string.asia)
?您需要使用资源键(例如“africa”)来实现此目的。使用资源值(例如“Afrique”)没有意义。请根据需要编辑您的答案,我想使用strings.xml中指定的字符串资源file@hitch.united使用您的建议后,我得到了以下错误:
变量“id”已经在此范围中定义了
。请注意,最好使用反射和/或工厂来替换此类开关。
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();
    }
}