Цвет границы кнопки не меняется при нажатии

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

gray_button.xml

<?xml version = "1.0" encoding = "utf-8"?>
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape = "oval">
            <stroke android:width = "3dp" android:color = "#646464" />
            <solid android:color = "@color/white" />
            <size android:width = "37dp" android:height = "40dp" />
        </shape>
    </item>
</selector>

green_button.xml

<?xml version = "1.0" encoding = "utf-8"?>
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape = "oval">
            <stroke android:width = "3dp" android:color = "@color/green" />
            <solid android:color = "@color/white" />
            <size android:width = "37dp" android:height = "40dp" />
        </shape>
    </item>
</selector>

CreateAlarm.java

    public class CreateAlarm extends Activity {

    private TimePicker mTimePicker;
    private EditText mTitle;
    private TextView mCancel, mRepeat,mSave;
    private String mselectedTime,mAlarmName,mSnoozeEnabled,mFlashLightEnabled,mVibrationEnabled,mVolumeIncreaseEnabled,mSunDay,mMonDay,mTueDay,mWedDay,mThuDay,mFriDay,mSatDay;
    private com.suke.widget.SwitchButton mSnooze,mFlashLight,mVibration,mVolumeIncrease;
    public String mSelectedDays;
    @Override
    protected void onCreate(Bundle savedInstanceState) {


        mFlashLight.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(SwitchButton view, boolean isChecked) {
                if (mFlashLight.isChecked()== true){
                    mFlashLightEnabled = "Enabled";
                }
            }
        });

        mVibration.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(SwitchButton view, boolean isChecked) {
                if (mVibration.isChecked()== true){
                    mVibrationEnabled = "Enabled";
                }
            }
        });

        mVolumeIncrease.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() {

                if (mSelectedDays.contains("Thu")){
                    mThuDay = "Thu";
                }else{
                    mThuDay = "Null";
                }
                if (mSelectedDays.contains("Fri")){
                    mFriDay = "Fri";
                }else{
                    mFriDay = "Null";
                }
                if (mSelectedDays.contains("Sat")){
                    mSatDay = "Sat";
                }else{
                    mSatDay = "Null";
                }
//SwitchButton isChecked Validation
                if (mSnoozeEnabled == null){
                    mSnoozeEnabled = "Disabled";
                }



                Intent intent = new Intent(CreateAlarm.this, AlarmActivity.class);


    @Override
    public void onStart() {

        super.onStart();
        if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        mRepeat.setText("");
    }

    @Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
    public void onEventMain(AlarmEvent alarmEvent) {

        if (alarmEvent.getSelectedEventType() == AlarmEvent.eventTypes.updateSelectedDay) {
            mRepeat.setText(alarmEvent.getSelectedDays());
        }

    }
    @Override
    public void onBackPressed() {
        super.onBackPressed();

        finish();
    }
}

Обновить :

CreateAlarm.java

public class CreateAlarm extends Activity {

    private CustomBorderButton mbtn_Sun,mbtn_Mon,mbtn_Tue,mbtn_Wed,mbtn_Thu,mbtn_Fri,mbtn_Sat;
    public String mAlarmTitle, mTime, mSun, mMon, mTue, mWed, mThu, mFri, mSat;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_alarm);

        mbtn_Sun = (CustomBorderButton) findViewById(R.id.mbtn_Sun);
        mbtn_Mon = (CustomBorderButton) findViewById(R.id.mbtn_Mon);
        mbtn_Tue = (CustomBorderButton) findViewById(R.id.mbtn_Tue);
        mbtn_Wed = (CustomBorderButton) findViewById(R.id.mbtn_Wed);
        mbtn_Thu = (CustomBorderButton) findViewById(R.id.mbtn_Thu);
        mbtn_Fri = (CustomBorderButton) findViewById(R.id.mbtn_Fri);
        mbtn_Sat = (CustomBorderButton) findViewById(R.id.mbtn_Sat);

        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            mTime = bundle.getString("mTime");
            mSun = bundle.getString("mSun");
            mMon = bundle.getString("mMon");
            mTue = bundle.getString("mTue");
            mWed = bundle.getString("mWed");
            mThu = bundle.getString("mThu");
            mFri = bundle.getString("mFri");
            mSat = bundle.getString("mSat");


            if (!(mAlarmTitle == null)) {
                mTitle.setText(mAlarmTitle);
            }

            if (mSun.contains("Sun")){
                mbtn_Sun.setEnabled(true);
            }
            if (mMon.contains("Mon")){
                mbtn_Mon.setEnabled(true);
            }
            if (mTue.contains("Tue")){
                mbtn_Tue.setEnabled(true);
            }
            if (mWed.contains("Wed")){
                mbtn_Wed.setEnabled(true);
            }
            if (mThu.contains("Thu")){
                mbtn_Thu.setEnabled(true);
            }
            if (mFri.contains("Fri")){
                mbtn_Fri.setEnabled(true);
            }
            if (mSat.contains("Sat")){
                mbtn_Sat.setEnabled(true);
            }
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
    public void onEventMain(AlarmEvent alarmEvent) {
        if (alarmEvent.getSelectedEventType() == AlarmEvent.eventTypes.updateSelectedDay) {
            mRepeat.setText(alarmEvent.getSelectedDays());
        }
    }

    private void finishActivity() {
        finish();
        mbtn_Sun.clearAllDays();
    }

    @Override
    public void onPause() {
        super.onPause();
        finishActivity();
    }
}

После загрузки этого действия я получил данные из предыдущего действия, и на основе этого я хочу, чтобы кнопки были включены / отключены, а также хочу соответствующим образом установить текст TextView (mRepeat).

1
0
189
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша ошибка - AppCompatButton. Вы должны расширять только Button.

Вам следует изучить EventBus: https://github.com/greenrobot/EventBus. Это обеспечивает активность уведомления или фрагментацию чего-либо.

Пожалуйста, попробуйте еще раз:

public class CustomBorderButton extends Button {

    private static HashSet<Integer> selectedDays = new HashSet<>();

    public CustomBorderButton(Context context) {
        this(context, null);
    }

    public CustomBorderButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomBorderButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {

                int id = view.getId();
                boolean isSelected = selectedDays.contains(id);

                Drawable bgDrawable;

                if (isSelected) {
                    bgDrawable = getBackgroundDrawable(R.drawable.gray_button);
                    selectedDays.remove(id);
                } else {
                    bgDrawable = getBackgroundDrawable(R.drawable.green_button);
                    selectedDays.add(id);
                }

                setBackground(bgDrawable);
                setSelectedDays();
            }
        });

    }

    private void setSelectedDays() {

        StringBuilder repeatDays = new StringBuilder();
        TreeMap<Integer, String> mAlarmDays = new TreeMap<>();

        if (selectedDays.size() == 0) {
            repeatDays = new StringBuilder("Never");
        } else {

            for (Integer selectedDayId : selectedDays) {

                switch (selectedDayId) {

                    case R.id.mbtn_Sun:

                        mAlarmDays.put(0, "Sun");
                        break;

                    case R.id.mbtn_Mon:
                        mAlarmDays.put(1, "Mon");
                        break;

                    case R.id.mbtn_Tue:
                        mAlarmDays.put(2, "Tue");
                        break;

                    case R.id.mbtn_Wed:
                        mAlarmDays.put(3, "Wed");
                        break;

                    case R.id.mbtn_Thu:
                        mAlarmDays.put(4, "Thu");
                        break;

                    case R.id.mbtn_Fri:
                        mAlarmDays.put(5, "Fri");
                        break;

                    case R.id.mbtn_Sat:
                        mAlarmDays.put(6, "Sat");
                        break;
                }
            }//for

            for (String day : mAlarmDays.values()) {
                repeatDays.append(day).append(" ");
            }

        }

        EventBus.getDefault().post(new AlarmEvent().updateSelectedDay(AlarmEvent.eventTypes.updateSelectedDay, repeatDays.toString().trim()));
    }

    public Drawable getBackgroundDrawable(int resourceId) {

        Drawable backgroundDrawable;

        if (android.os.Build.VERSION.SDK_INT >= 21) {
            backgroundDrawable = getResources().getDrawable(resourceId, getContext().getTheme());
        } else {
            backgroundDrawable = getResources().getDrawable(resourceId);
        }

        return backgroundDrawable;
    }
}

CreateAlarm.java

    public class CreateAlarm extends Activity {

    private TimePicker mTimePicker;
    private TextView mCancel, mRepeat;
    private ImageView mRepeatIcon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_alarm_layout);
        Utils.darkenStatusBar(this, R.color.StatusbarColor);

        mTimePicker = (TimePicker) findViewById(R.id.mTimePicker);
        mCancel = (TextView) findViewById(R.id.mCancel);
        mRepeat = (TextView) findViewById(R.id.mRepeat);

        int hours = mTimePicker.getCurrentHour();
        mCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }

    @Override
    public void onStart() {

        super.onStart();
        if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        mRepeat.setText("");
    }

    @Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
    public void onEventMain(AlarmEvent alarmEvent) {

        if (alarmEvent.getSelectedEventType() == AlarmEvent.eventTypes.updateSelectedDay) {
            mRepeat.setText(alarmEvent.getSelectedDays());
        }

    }

}

AlarmEvent:

public class AlarmEvent {

    private eventTypes selectedEventType;
    private String selectedDays = "";

    public String getSelectedDays() {
        return selectedDays;
    }

    public eventTypes getSelectedEventType() {
        return selectedEventType;
    }

    public enum eventTypes {
        updateSelectedDay
    }

    public AlarmEvent updateSelectedDay(eventTypes newEvent, String selectedDays) {

        AlarmEvent alarmEvent = new AlarmEvent();
        alarmEvent.selectedEventType = newEvent;
        alarmEvent.selectedDays = selectedDays;

        return alarmEvent;
    }
}

> Ответьте на свой комментарий:

CreateAlarm

clickSave(){

  Intent intent = new Intent(CreateAlarm.this, AlarmActivity.class);
  finish();
  startActivity(intent);
}

   @Override
   public void onBackPressed() {
   super.onBackPressed();

   finish();
    }

AlarmActivity

@Override
public void onBackPressed() {
    super.onBackPressed();

    finish();
}

две вещи идут не так: кнопки изменили цвет после двух щелчков и текст кнопок не добавляется в TextView при нажатии уважаемой кнопки, пожалуйста, помогите мне исправить это @propoLis

Nikson 14.05.2018 18:45

Да, я хочу, чтобы он был упорядоченным, и выбранные дни всегда будут отображаться в определенной позиции, например 0 для солнца, 1 для понедельника, как это, тогда, только если я выбрал дни в случайном порядке, они появятся в определенном порядке @прополис

Nikson 15.05.2018 16:25

братан, мне нужна твоя помощь, здесь, используя приведенный выше код, я пытаюсь привязать выбранный текст кнопок к другому текстовому представлению, он работает нормально, когда я нажимаю кнопки с солнца на сиденье, но это идет не так, когда я случайным образом выбираю кнопки для ex: Если я выбрал день среды после загрузки действия, он привяжет все дни к текстовому просмотру. пожалуйста, помогите мне решить эту проблему. @прополис

Nikson 04.06.2018 17:56

Я пробовал этот код, который работает правильно, даже если он случайный

propoLis 05.06.2018 10:57

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

Nikson 05.06.2018 16:49

ищу ваше предложение сделать следующий @propoLis

Nikson 05.06.2018 17:33

пожалуйста, посмотрите на функцию паузы

propoLis 06.06.2018 09:16

Братан, я обновил свой файл CreateAlarm.java, проверьте его, я все еще сталкиваюсь с той же проблемой. @ PropoLis

Nikson 06.06.2018 17:41

пожалуйста, поделитесь своим макетом еще раз и не удаляйте при возникновении вопроса

propoLis 07.06.2018 09:49

Пожалуйста, проверьте файл макета, который я обновил @propoLis

Nikson 07.06.2018 14:59

братан ждет твоих указаний @propoLis

Nikson 07.06.2018 16:17

Я не понял твоей ошибки. Я пробовал это: "пожалуйста, проверьте вот так: после загрузки активности один раз выберите все кнопки, начинающиеся со ср и отмените выбор всех кнопок, теперь закройте действие. Снова откройте действие, теперь выберите среду, которая будет связывать все дни" Но не сделал ошибка.

propoLis 08.06.2018 09:15

как только я открою приложение и выберу кнопки подряд с воскресенья по субботу, затем нажмите кнопку «Сохранить» (это закроет текущее действие и откроет новое действие). Он отображает все выбранные дни в виде тоста. Теперь вернитесь к действию, в котором я теперь у меня есть кнопки, я выбираю кнопку среда, она свяжет все дни в Textview, и после закрытия активности, нажав кнопку сохранения, он показывает все дни в тосте, но я выбрал только среду, это моя проблема @propoLis

Nikson 08.06.2018 09:26

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

Nikson 08.06.2018 09:27

применил изменения, но с той же проблемой, действительно запутал @propoLis

Nikson 08.06.2018 10:22

Не могли бы вы перепроверить мой обновленный файл CreateAlarm.java @propoLis

Nikson 08.06.2018 10:52

Бру, я обнаружил ту же проблему в приложении, которое ты сейчас дал. Просто перепроверьте это, братан, выберите с воскресенья по субботу после загрузки активности, затем нажмите `` Сохранить '' и выйдите из приложения ... Теперь снова перейдите в приложение, просто выберите только воскресенье, вы получите все дни вместо одного воскресенья @propoLis

Nikson 08.06.2018 12:22

Большое спасибо, приятель ... Могу ли я узнать, в чем проблема? @ PropoLis

Nikson 08.06.2018 14:57

приятель, мне нужна твоя помощь, теперь я пытаюсь включить / отключить кнопки на основе значений базы данных, которые я сохранил ранее. Но в моем случае я не могу сделать его включенным / отключенным. Я обновил свой код createalarm.java пожалуйста, помогите мне это исправить. @ propoLis

Nikson 20.06.2018 18:58

Я не понимаю вашу проблему, опишите ее

propoLis 21.06.2018 09:31

приятель, у меня нет никаких проблем. В этом приложении у меня есть два действия: 1 - AlarmActivity, который отображает все сигналы, установленные пользователем. Другой - действие createAlarm, которое используется для создания сигналов. Вот что я хочу сделать, это когда пользователь нажимает (кнопку редактирования) на тревоге в тревожной активности, которая откроет создание тревожной активности и покажет подробную информацию о выбранной тревоге. Для этого я хочу включить и отключить кнопки (круглые кнопки) .Я установил все остатки (таймер, заголовок и т. д.), кроме круглых кнопок, потому что у меня есть отдельный класс и событие для этого, пожалуйста, помогите мне исправить это

Nikson 21.06.2018 09:39

@Nikson ты подожди до понедельника :) Я точно очень занята

propoLis 27.06.2018 17:52

Братан, я только что закончил, спасибо за ответ, и вернусь, если у меня возникнут какие-либо сомнения в ближайшие дни @propoLis

Nikson 27.06.2018 17:57

Вы можете просто создать селектор в res / drawable

<?xml version = "1.0" encoding = "utf-8"?>

<item android:state_activated = "true" android:drawable = "@drawable/gray_button"></item>
<item android:state_activated = "false" android:drawable = "@drawable/green_button"></item>

Затем в вашем настраиваемом BorderButton вместо изменения фона просто установите активированное состояние кнопки

if (isSelected) {
                setActivated(false);
                selectedDays.remove(id);
            } else {
                setActivated(true);
                selectedDays.add(id);
            }

Ах, теперь у меня ошибка, на самом деле setOnclickListener внутри класса CustomBorderColor.java не вызывается, потому что вы переопределяете clicklistener внутри Activity, поэтому вы должны изменить фон (или изменить состояние активированного) внутри действия ... ты понял это сейчас !!! Вы должны установить состояние для каждого экземпляра CustomBorderColor в onCLick внутри действия

Anis MARZOUK 14.05.2018 18:03

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