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