Android Switch не переключается программно

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

Я пытался использовать как myswitch.setischecked(false), так и myswitch.toggle, и они оба оставляют переключатель в текущем состоянии, но меняют фон с синего на серый, поэтому Android думает, что переключатель выключен, однако дисплей не отражает этого .

Вот мой код

  final Switch InstaPrint = (Switch) rootView.findViewById(R.id.instaprint);
        final Switch MyZebraSwitch = (Switch) rootView.findViewById(R.id.myzebraswitch);
        final Switch StockZebraSwitch = (Switch) rootView.findViewById(R.id.stockzebraswitch);
        final Switch StoreZebraSwitch = (Switch) rootView.findViewById(R.id.storezebraswitch);

        final Spinner MyZebraSpinner = (Spinner) rootView.findViewById(R.id.myzebraspinner);
        final Spinner StockZebraSpinner = (Spinner) rootView.findViewById(R.id.stockzebraspinner);
        final Spinner StoreZebraSpinner = (Spinner) rootView.findViewById(R.id.storezebraspinner);


        //InstantPrint

        InstaPrint.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(InstaPrint.isChecked())
                {
                    if(!MyZebraSwitch.isChecked() && !StockZebraSwitch.isChecked() && !StoreZebraSwitch.isChecked())
                    {

                        Vibrator vib = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
                        vib.vibrate(1000);
                       // PlayFile("bell.mp3");
                        Toast toast = Toast.makeText(getActivity(), "You must select at least one printer", Toast.LENGTH_LONG);
                        toast.show();
                        InstaPrint.toggle();
                    }
                }
            }
        });

Кто-нибудь еще страдал от этого?

РЕДАКТИРОВАТЬ. После того, как я поиграл, я обнаружил, что изменение ориентации моего устройства устраняет проблему, мои переключатели содержат фрагмент, поэтому перерисовка фрагмента, кажется, исправляет его, теперь просто нужно решить, как перерисовывать программно!


person dave    schedule 06.01.2015    source источник


Ответы (1)


Кажется немного нелогичным вызывать методы toggle() или setChecked(boolean) внутри прослушивателя состояния. Я бы ожидал какого-то бесконечного цикла или странного поведения, потому что вы программно меняете состояние внутри обратного вызова с измененным состоянием. Вместо этого я бы попробовал использовать метод setOnClickListener(View.OnClickListener), унаследованный от класса View.

person Steve    schedule 06.01.2015
comment
Это лучше, чем комментарий, и заслуживает баллов за ответ, точно соответствует действительности и решает мою проблему. - person dave; 06.01.2015
comment
@dave тот факт, что изменение ориентации решает вашу проблему, также подтверждает мои ожидания. Уничтожение активности, а также вашего фрагмента и их перерисовка (что происходит при каждом изменении ориентации) убьет этот бесконечный циклический процесс, который, как я подозревал, происходит. Я бы попробовал исправить проблему, не прибегая каждый раз к перерисовке фрагмента. - person Steve; 06.01.2015