2016-10-13 3 views
1

Сейчас я использую переключатель случаяКакая разница при использовании switch-case vs. if-else для radioGroup в Android?

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
     { 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       switch(checkedId){ 
        case R.id.Eng: 
         // do operations specific to this selection 
         setLocale("en_US"); 
         Intent intentEng = new Intent(getActivity(), Some.class); 
         startActivity(intentEng); 
         break; 

        case R.id.French: 
         // do operations specific to this selection 
         setLocale("fr"); 
         Intent intent = new Intent(getActivity(), Some.class); 
         startActivity(intent); 
         break; 
       } 
      } 
     }); 

Что происходит иногда я нажимаю первый переключатель, и я сразу же нажмите вторую, а также.

В блоке case передаю намерение классу службы, который ведет переговоры с веб-службами и обновляет arrayAdapter для ListView.

Поскольку я быстро нажимаю обе кнопки-переключатели, пользовательский интерфейс получает результаты обоих языков (блоки блокировки). 1) Как этого избежать? 2) Используется ли в этом случае использование коммутационного корпуса вместо вопросов if-else?

ответ

0

Возможно, я не понимаю, что вы делаете, но при условии, что вы запускаете и показываете другое действие поверх текущего, вы можете позвонить finish() после запуска нового действия.

В противном случае вы можете объявить поле booleanshouldHandleCheckChanged или что-то, чтобы отслеживать, обрабатывать ли какие-либо случаи в onCheckChanged(). Вы можете установить значение false сразу после запуска нового действия, а затем установить его значение true, как только вы получите любое обновление, которое вы ожидаете.

0

Вы можете сделать что-то вроде этого, в классе деятельности сделать логическое поле:

Private isLoadingNewActivity = false; 

В вашей onResume сделать это ложь:

isLoadingNewActivity = false; 

И прослушивателе проверить это:

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      If(isLoadingNewActivity) 
      return; 
      switch(checkedId){ 
       case R.id.Eng: 
        // do operations specific to this selection 
        setLocale("en_US"); 
        Intent intentEng = new Intent(getActivity(), Some.class); 
        startActivity(intentEng); 
        isLoadingNewActivity = true; 
        break; 

       case R.id.French: 
        // do operations specific to this selection 
        setLocale("fr"); 
        Intent intent = new Intent(getActivity(), Some.class); 
        startActivity(intent); 
        isLoadingNewActivity = true; 
        break; 
      } 
     } 
    }); 
+0

Не следует ли 'isLoadingNewActivity = false;' вызываться, когда «адаптер» обновляет данные? 'onResume' никогда не может быть вызван, поскольку OP запускает' Сервис'. –

+0

Вопрос не содержит никаких попыток запуска. Его цель - открыть другую деятельность. –

+0

Справа. Цитирование OP «В блоке case я передаю намерение классу службы, который говорит с веб-службами». Я просто прочитал это и пропустил часть «startActivity()» –

1

После получения события onCheckedChanged отключите свои переключатели

+0

. Я хотел бы отключить весь экран (я имею в виду показ прозрачного слоя стекла поверх уровня существующей активности) и показать символ загрузки, пока не покажу следующее действие. Как это сделать? – user3705478

+0

Извините за поздний ответ. Я имею в виду вызов метода setEnabled (false) на ваших объектах RadioButton. После этого они перестают получать какие-либо пользовательские взаимодействия. Для показа символов загрузки вы должны использовать использование ProgressDialog. В случае диалога прогресса вам не нужно отключать RadioButtons, но кратковременное диалоговое окно выглядит как мигающее. Пожалуйста, проверьте оба способа ... – vadimvolk

1

Это полностью зависит от вашего интерфейса. вы отключите радиокнопки после вызова «onCheckedChanged» также неверно. потому что после выбора одного языка пользователь может захотеть изменить выбор, поэтому вы должны предоставить компонент подтверждения в пользовательском интерфейсе.

В чем разница здесь, если мы используем случай переключения или if-else для вашего сценария.

+0

Я хотел бы отключить весь экран (я имею в виду показ прозрачного стеклянного стекла на верхнем уровне существующего действия) и показать символ загрузки, пока не покажу следующее действие. Как это сделать? – user3705478