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

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

Я попытался использовать 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();
                    }
                }
            }
        });

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

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

1 ответ

Решение

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

Другие вопросы по тегам