如何将开关案例场景与字符串资源而不是硬编码名称一起使用?我的字符串与用于拼写的字符完全相同。
@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 {
}
答案 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;
}