2015-07-31 3 views
3

Как я могу использовать сценарий сценария переключения со строковыми ресурсами, а не с жестко закодированными именами? Мои строки - это те же имена, что и для написания.Как использовать корпус коммутатора со строковыми ресурсами

 @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

Обратите внимание, что этот тип переключателя лучше всего заменять отражением и/или фабрикой. – chrylis

ответ

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.. 

Это лучше, чем жестко прописывать, потому что вы будете иметь возможность повторно использовать эти константы через приложение.

Если те строки пользовательского интерфейса вы можете объявить их в strings.xml

+1

Имейте в виду, что мое приложение будет на разных языках. Вы жестко закодировали «африку» и «азию». Я не могу использовать 'getResources(). GetString (R.string.africa)' и 'getResources(). GetString (R.string.asia)' вместо этого? – MacaronLover

+0

Я не тестировал это, но, возможно, вы могли бы использовать идентификатор строкового ресурса? то вы можете использовать переключатель с целыми числами. –

+0

Является ли «africa» строкой UI? Я имею в виду, он отображается пользователю? Если да, то логика ошибочна. Вы не должны создавать условия в зависимости от строк, которые изменяются с помощью локали. –

3

коммутатора меток (это в case "africa":"africa") должен быть constant expressions согласно JLS § 14.12. Поэтому, если вы хотите использовать switch, вам нужно будет сохранить значение ресурса строки в постоянной переменной, а затем использовать эту константу в качестве метки переключателя.

Пример (использовать константы либо класса или локальные константы):

class Example { 
    public static final String CONTINENT_EUROPE = 
     getResources().getString(R.string.europe); // Option 1: class constants 
    public static final String CONTINENT_NORTHERN_AMERICA = 
     getResources().getString(R.string.northernAmerica); 

    public void foo() { 
    final String continentAfrica = 
     getResources().getString(R.string.africa); // Option 2: local constants 
    final String continentAsia = 
     getResources().getString(R.string.asia); 
    switch (continent) { 
    // Option 1: 
    case continentAfrica: 
     newFragment = new FragmentAfrica(); 
     break; 
    case continentAsia: 
     newFragment = new FragmentAsia(); 
     break; 
    // Option 2: 
    case CONTINENT_EUROPE: 
     newFragment = new FragmentEurope(); 
     break; 
    case CONTINENT_NORTHERN_AMERICA: 
     newFragment = new FragmentNorthernAmerica(); 
     break; 
    // ... 
    } 
} 
+0

@MacaronLover Я добавил простой пример. Надеюсь, вы поняли эту идею. –

+0

Пожалуйста, отредактируйте свой ответ, чтобы показать более одного ресурса строки, как с одним, это не очень помогает. – MacaronLover

+0

@MacaronLover Я добавил еще два континента. ^^ –

-1

Вы должны объявить его как перечисление:

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

Помните, что мое приложение будет на разных языках. Например. французы не говорят «Африка», говорят «Afrique». Не могу использовать 'getResources(). getString (R.string.africa)' и 'getResources(). getString (R.string.asia)' вместо ? – MacaronLover

+0

вам нужно использовать ключ ресурса (например, «африка»). использование значения ресурса (например, «Afrique») не имеет смысла. – ChrisKo

+1

При необходимости отредактируйте свой ответ, я хочу использовать строковые ресурсы, указанные в файле strings.xml. – MacaronLover

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 и переключить фрагмент. Он также будет работать с разными языками, потому что это всего лишь идентификатор ресурса.

+0

Я не знаком с android. что означает R.string.africa? это ключ в файле свойств? – ChrisKo

+0

@ hitch.united После использования вашего предложения я получаю эту ошибку: 'Variable 'id' уже определен в этой области'. – MacaronLover

+1

@ChrisKo, «R» - это градиент файла, который создается автоматически. Таким образом, вы можете получить доступ к своим строковым ресурсам с ним, как в моем примере. –

Смежные вопросы