В моем приложении 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).
Ваша ошибка - 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();
}
Да, я хочу, чтобы он был упорядоченным, и выбранные дни всегда будут отображаться в определенной позиции, например 0 для солнца, 1 для понедельника, как это, тогда, только если я выбрал дни в случайном порядке, они появятся в определенном порядке @прополис
братан, мне нужна твоя помощь, здесь, используя приведенный выше код, я пытаюсь привязать выбранный текст кнопок к другому текстовому представлению, он работает нормально, когда я нажимаю кнопки с солнца на сиденье, но это идет не так, когда я случайным образом выбираю кнопки для ex: Если я выбрал день среды после загрузки действия, он привяжет все дни к текстовому просмотру. пожалуйста, помогите мне решить эту проблему. @прополис
Я пробовал этот код, который работает правильно, даже если он случайный
Пожалуйста, проверьте это так: после загрузки активности один раз выберите все кнопки, начинающиеся со ср и снимите выделение со всех, теперь закройте действие. Снова откройте действие, теперь выберите среду, которую он будет связывать все дни. @прополис
ищу ваше предложение сделать следующий @propoLis
пожалуйста, посмотрите на функцию паузы
Братан, я обновил свой файл CreateAlarm.java, проверьте его, я все еще сталкиваюсь с той же проблемой. @ PropoLis
пожалуйста, поделитесь своим макетом еще раз и не удаляйте при возникновении вопроса
Пожалуйста, проверьте файл макета, который я обновил @propoLis
братан ждет твоих указаний @propoLis
Я не понял твоей ошибки. Я пробовал это: "пожалуйста, проверьте вот так: после загрузки активности один раз выберите все кнопки, начинающиеся со ср и отмените выбор всех кнопок, теперь закройте действие. Снова откройте действие, теперь выберите среду, которая будет связывать все дни" Но не сделал ошибка.
как только я открою приложение и выберу кнопки подряд с воскресенья по субботу, затем нажмите кнопку «Сохранить» (это закроет текущее действие и откроет новое действие). Он отображает все выбранные дни в виде тоста. Теперь вернитесь к действию, в котором я теперь у меня есть кнопки, я выбираю кнопку среда, она свяжет все дни в Textview, и после закрытия активности, нажав кнопку сохранения, он показывает все дни в тосте, но я выбрал только среду, это моя проблема @propoLis
Просто проблема в том, что он работает так, как я ожидал. Когда приложение загружается, и я выбрал кнопки в первый раз, если я выберу кнопки в следующий раз, не закрывая приложение, все пойдет не так @propoLis
применил изменения, но с той же проблемой, действительно запутал @propoLis
Не могли бы вы перепроверить мой обновленный файл CreateAlarm.java @propoLis
Бру, я обнаружил ту же проблему в приложении, которое ты сейчас дал. Просто перепроверьте это, братан, выберите с воскресенья по субботу после загрузки активности, затем нажмите `` Сохранить '' и выйдите из приложения ... Теперь снова перейдите в приложение, просто выберите только воскресенье, вы получите все дни вместо одного воскресенья @propoLis
Большое спасибо, приятель ... Могу ли я узнать, в чем проблема? @ PropoLis
приятель, мне нужна твоя помощь, теперь я пытаюсь включить / отключить кнопки на основе значений базы данных, которые я сохранил ранее. Но в моем случае я не могу сделать его включенным / отключенным. Я обновил свой код createalarm.java пожалуйста, помогите мне это исправить. @ propoLis
Я не понимаю вашу проблему, опишите ее
приятель, у меня нет никаких проблем. В этом приложении у меня есть два действия: 1 - AlarmActivity, который отображает все сигналы, установленные пользователем. Другой - действие createAlarm, которое используется для создания сигналов. Вот что я хочу сделать, это когда пользователь нажимает (кнопку редактирования) на тревоге в тревожной активности, которая откроет создание тревожной активности и покажет подробную информацию о выбранной тревоге. Для этого я хочу включить и отключить кнопки (круглые кнопки) .Я установил все остатки (таймер, заголовок и т. д.), кроме круглых кнопок, потому что у меня есть отдельный класс и событие для этого, пожалуйста, помогите мне исправить это
@Nikson ты подожди до понедельника :) Я точно очень занята
Братан, я только что закончил, спасибо за ответ, и вернусь, если у меня возникнут какие-либо сомнения в ближайшие дни @propoLis
Вы можете просто создать селектор в 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 внутри действия
две вещи идут не так: кнопки изменили цвет после двух щелчков и текст кнопок не добавляется в TextView при нажатии уважаемой кнопки, пожалуйста, помогите мне исправить это @propoLis