ToggleButton onCheckChangeListener

Я делаю приложение с кнопкой записи и переключателем. Кнопка записи начинает запись звука, а кнопка-переключатель объявляет, нужно ли кнопку записи УДЕРЖИВАТЬ для записи или нажимать только один раз. Вот как я пытаюсь этого добиться:

touchToRecord.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            saveCheckedState("touchToRecord", isChecked);

            if (isChecked)
            {
                recBtn.setOnTouchListener(new OnTouchListener(){

                    @Override
                    public boolean onTouch(View v, MotionEvent event) {

                        if (event.getAction() == MotionEvent.ACTION_DOWN)
                        {
                            recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn_pressed);
                            chTimer.setBase(SystemClock.elapsedRealtime());
                            chTimer.setText("00:00:00");
                            chTimer.start();
                            chTimer.setTextColor(Color.GREEN);
                            startRecording();
                        }
                        else if (event.getAction() == MotionEvent.ACTION_UP)
                        {
                            recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn);
                            chTimer.stop();
                            chTimer.setBase(SystemClock.elapsedRealtime());
                            chTimer.setText("00:00:00");
                            chTimer.setTextColor(Color.GRAY);
                            stopRecording();
                            nameAlert();
                        }
                        return true;
                    }
                });
            }
            else if (isChecked == false)
            {

            }

Как вы можете видеть, если переключатель включен или отмечен, кнопку записи нужно удерживать нажатой для записи, и когда вы отпускаете кнопку og, запись останавливается. Теперь это работает, но у него есть только один недостаток. Я сохраняю состояние isChecked в общих настройках, поэтому, если я включу переключатель, а затем перезапущу приложение, переключатель останется включенным, но мне придется снова его выключить и снова включить, чтобы он работал. Поэтому, если я перезапущу приложение, оно все еще будет включено, но не будет работать.

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

Мой код сейчас:

if (touchToRecord.isChecked() == true)
    {
         recBtn.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn_pressed);
                    startTimer();
                    startRecording();
                }
                else if (event.getAction() == MotionEvent.ACTION_UP)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn);
                    stopTimer();
                    stopRecording();
                    nameAlert();
                }
            return true;
            }
        });
    }

    if (touchToRecord.isChecked() == false)
    {
        recBtn.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                if (recorder == null)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn_pressed);
                    startTimer();
                    startRecording();
                }
                else if (recorder != null)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn);
                    stopTimer();
                    stopRecording();
                    nameAlert();
                }
            }
        });
    }

Слушатель OnCheckedChange:

touchToRecord.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            saveCheckedState("touchToRecord", isChecked);
        }
    });

Получить состояние переключателя из общих настроек:

touchToRecord.setChecked(getCheckedState("touchToRecord"));

person Guy    schedule 14.08.2013    source источник
comment
Почему вы сохраняете состояние «проверено» в общих настройках?   -  person Namenlos    schedule 15.08.2013
comment
@Namenlos, потому что я хочу, чтобы приложение запоминало настройку, чтобы пользователю не приходилось менять ее каждый раз, когда приложение открывается. Что-то не так с этим?   -  person Guy    schedule 15.08.2013
comment
Нет, все в порядке, я ошибся ;-)   -  person Namenlos    schedule 15.08.2013


Ответы (1)


Это про вашу логику. У вас есть onCheckedChangeListener, что означает, что вы будете проверять, включено или выключено, когда пользователь изменит Toggle Button. Поэтому, когда вы убьете приложение и запустите его снова, поскольку в Toggle Button нет изменений, оно не сработает.

Поместите свой onTouchListener за пределы onCheckedChangeListener. В onCheckedChangeListener установите свой статус (Вкл. или Выкл.), а внутри onTouchListener проверьте, установлен ли он Вкл. или Выкл.. и выполнять свои действия.

person Gokhan Arik    schedule 14.08.2013
comment
Большое тебе спасибо! Это именно тот ответ, который мне был нужен, я знал, что с моей логикой что-то не так, но я не мог указать на это пальцем. Еще одна вещь, должен ли я делать все это внутри onCreate? - person Guy; 15.08.2013
comment
Может быть, вы забываете сделать перерыв на кофе :) Я тоже всегда ставлю его, так что все должно быть в порядке. Не забудьте отметить ответ принятым для будущих ссылок - person Gokhan Arik; 15.08.2013
comment
Еще одна вещь: p могу ли я сделать оператор if внутри onCreate? Например: если кнопка-переключатель отмечена, то реализуйте ontouchlistener, иначе, если кнопка-переключатель не отмечена, то реализуйте onclicklistener. Так как теперь я просто реализую dboth onclicklistener и онтоучлистенер, а затем я написал оператор if внутри них, и это не совсем работает, как я предполагал. - person Guy; 15.08.2013
comment
Для чего вам нужен onClickListener? - person Gokhan Arik; 15.08.2013
comment
Что ж, как я уже сказал в своем исходном сообщении, если переключатель отмечен, я хочу, чтобы кнопка записи записывала только ее касание и удерживание (для этого предназначен onTouchListener), и если переключатель не отмечен, вы должны нажать кнопку, чтобы начать запись, а затем нажмите еще раз, чтобы остановить запись (для этого предназначен onClickListener), если вы понимаете, о чем я - person Guy; 15.08.2013
comment
Понял, не обратил внимания. Вы правы, создайте оператор if, если Toggle включен, создайте onTouchListener, если он выключен, создайте onClickListener. - person Gokhan Arik; 15.08.2013
comment
Пожалуйста, проверьте мой исходный пост еще раз, я разместил код, который у меня есть сейчас. По какой-то причине он по-прежнему не будет работать должным образом, не имеет значения, включен ли переключатель сейчас или нет, он будет реализовывать onTouchListener. Есть идеи, что сейчас может быть не так? - person Guy; 15.08.2013
comment
давайте продолжим это обсуждение в чате - person Gokhan Arik; 15.08.2013