Пользовательское изображение флажка android

Есть ли простой способ использовать собственное изображение для флажка? Я хочу продублировать «отмеченное» поведение Gmail. Итак, я хочу иметь флажок, который, когда он установлен, представляет собой заполненную звезду. А когда не отмечен — пустая звезда. Должен ли я сам использовать просмотр изображений и логику?


Флажки являются дочерними элементами Button, вы можете просто дать своему флажку фоновое изображение с несколькими состояниями, как описано здесь, в разделе «Стиль кнопки»:

… и проиллюстрирован здесь:


301

Создайте настраиваемый селектор флажков:

   Xml version = "1.0" encoding = "utf-8"?>      

Убедитесь, что ваш флажок похож на этот android: button = "@ drawable/checkbox_selector"

    

Поделиться
Улучшить этот ответ
отредактировано 10 февраля ’16 в 21:25
Bojan Dević
1,7861212 серебряных знаков2424 бронзовых знака
ответил 15 июля ’13 в 17:46
  • В какой записи вы указываете этот селектор? В самом XML-файле, где вы также указываете CheckBox? — Том Хэммонд, 27 марта 2014, 20:14
  • Том: создайте свой селектор в папке с возможностью переноса и установите флажок в папке макета — Мохамед Хишам ибн Ханифа, 28 марта 2014, 18:50
  • Мне пришлось заменить «кнопку» на «фон» в CheckBox — Франсиско Корралес Моралес, 30 декабря 2014 г., 20:01
  • Для заполнения см. stackoverflow. ru/questions/4037795/… — PiTheNumber 4 мая 2015 г., 8:53
  • 2
    Я обновил свой проект до android x, после этого я не смог настроить свой флажок, как вы сказали до уровня api 21 и android: кнопка не работает. — Мисаг Агахани 29 апр. ’19 в 20:56
| показать 4 дополнительных комментария

Создание настраиваемого селектора флажков:

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

Убедитесь, что ваш флажок такой: android:button="@drawable/checkbox_selector"

    

45

Скопируйте файл btn_check.xml f rom android-sdk/platform/android — #/data/res/drawable в папку с возможностью рисования вашего проекта и измените состояния изображения ‘on’ и ‘off’ на свои собственные изображения.

Затем ваш xml просто понадобится android:button="@drawable/btn_check"

    

Если вы хотите использовать другие значки Android по умолчанию, вы можете использовать android: button = "@ android: drawable/..."

Поделиться
Улучшить этот ответ
ответил 01 августа 2012 в 20:14
  • 2
    Плохой совет. Иконки могут быть изменены от версии к версии и могут вообще исчезнуть. Если вам действительно нравится значок по умолчанию, вы можете взять его из исходников. — Корнильцев Анатолий 13 окт. 2012, в 7:51
  • Вы хотите сказать, что ссылаетесь на значки по умолчанию напрямую через «@android: drawable/… «- плохая идея, или этот процесс полностью? — WOUNDEDStevenJones, 16 октября 2012 г., 19:42
  • 2
    Пример: ссылка на значки holo приведет к сбою вашего приложения на устройствах до сотовой связи. Такие проблемы действительно сложно поддерживать и отлаживать. Поэтому я обычно копирую не только xml, но изображения тоже должны быть на сотни процентов уверены, что ресурсы будут найдены. Также это очень важно, чтобы пользовательский интерфейс выглядел одинаково на всех устройствах. — Корнильцев Анатолий 18 окт., 06:47
добавить комментарий |

Скопируйте btn_check.xml из android -sdk/platform/android — #/data/res/drawable в папку с возможностью рисования вашего проекта и измените состояния изображения ‘on’ и ‘off’ на свои пользовательские изображения.

Тогда ваш xml будет просто нужен android:button="@drawable/btn_check"

    

Если вы хотите использовать другие значки Android по умолчанию, вы можете использовать android: button =" @ android: drawable/... "


17

res/drawable/day_selector.xml

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

res/layout/my_layout.xml

    

Поделиться
Улучшить этот ответ
ответил 28 июня ’18 в 07:36
  • 1
    Некоторые пояснения помогут новым пользователям понять, как ваш код решает проблему. — Брайан Томпсетт — 汤 莱恩 28 июня ’18 в 7:55
добавить комментарий |

res/drawable/day_selector.xml

   xml version = "1. 0 "encoding =" utf-8 "?>       

res/layout/my_layout.xml

  

7

Если у вас есть открытый исходный код Android, вы можете найти определение стилей в разделе:
src/frameworks/base/core/res/res/values ​​

    @android: drawable/btn_check_label_background  ? android: attr/listChoiceIndicatorMultiple    

Поделиться
Улучшите этот ответ
отредактировал 24 февраля 2015, в 17:03
JJD
43.6k4848 золотых значков 179179 серебра 298298 бронзовых знаков
ответил 18 окт. в 08:43
добавить комментарий |

Если у вас есть открытый исходный код Android, вы можете найти определение стилей в разделе:
src/ frameworks/base/core/res/res/values ​​

    @android: drawable/btn_check_label_background  ? android: attr/listChoiceIndicatorMultiple  

4

Попробуйте —

  пакет  com; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; открытый класс CheckBoxImageView расширяет ImageView реализует View. OnClickListener {логическое значение проверено;  int defImageRes;  int checkedImageRes;  OnCheckedChangeListener onCheckedChangeListener;  общедоступный CheckBoxImageView (контекст контекста, AttributeSet attr, int defStyle) {super (context, attr, defStyle);  init (attr, defStyle);  } общедоступный CheckBoxImageView (контекст контекста, AttributeSet attr) {super (context, attr);  инициализация (атрибут, -1);  } общедоступный CheckBoxImageView (контекст контекста) {супер (контекст);  } публичное логическое значение isChecked () {возвращение проверено;  } public void setChecked (логическое значение проверено) {this.checked = проверено;  setImageResource (проверено? checkedImageRes: defImageRes);  } private void init (AttributeSet attributeSet, int defStyle) {TypedArray a = null;  if (defStyle! = -1) a = getContext (). receiveStyledAttributes (attributeSet, R.styleable.CheckBoxImageView, defStyle, 0);  иначе a = getContext (). receiveStyledAttributes (attributeSet, R.styleable.CheckBoxImageView);  defImageRes = a.getResourceId (0, 0);  checkedImageRes = a.getResourceId (1, 0);  проверено = a.getBoolean (2, ложь);  a.recycle ();  setImageResource (проверено? checkedImageRes: defImageRes);  setOnClickListener (это);  } @Override public void onClick (View v) {проверено =! Проверено;  setImageResource (проверено? checkedImageRes: defImageRes);  onCheckedChangeListener.onCheckedChanged (это проверено);  } public void setOnCheckedChangeListener (OnCheckedChangeListener onCheckedChangeListener) {this.onCheckedChangeListener = onCheckedChangeListener;  } общедоступный статический интерфейс OnCheckedChangeListener {void onCheckedChanged (View buttonView, логическое isChecked);  }}  

Добавить этот атрибут —

        

Используйте подобное —

    

Это исправит все ваши проблемы.

Поделиться
Улучшите этот ответ
ответил 21 июля 2015, 09:26
  • Отсутствуют onSaveInstanceState () и onRestoreInstanceState () , я думаю, что отмеченное состояние будет потеряно при вращении — EpicPandaForce, 2 декабря 2015 г., 13:23
добавить комментарий |

Попробовать —

  package com;  import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; общедоступный класс CheckBoxImageView расширяет ImageView реализует View.OnClickListener {логическое значение проверено;  int defImageRes; int checkedImageRes; OnCheckedChangeListener onCheckedChangeListener; общедоступный CheckBoxImageView (контекст контекста, AttributeSet attr, int defStyle) {super (context, attr, defStyle); init (attr, defStyle);} public CheckBoxImageView (контекст атрибута) (контекст атрибута)  (контекст, атрибут);  инициализация (атрибут, -1);  } общедоступный CheckBoxImageView (контекст контекста) {супер (контекст);  } публичное логическое значение isChecked () {возвращение проверено;  } public void setChecked (логическое значение проверено) {this.checked = проверено;  setImageResource (проверено? checkedImageRes: defImageRes);  } private void init (AttributeSet attributeSet, int defStyle) {TypedArray a = null;  if (defStyle! = -1) a = getContext (). receiveStyledAttributes (attributeSet, R.styleable.CheckBoxImageView, defStyle, 0);  иначе a = getContext (). receiveStyledAttributes (attributeSet, R.styleable.CheckBoxImageView);  defImageRes = a.getResourceId (0, 0);  checkedImageRes = a.getResourceId (1, 0);  проверено = a.getBoolean (2, ложь);  a.recycle ();  setImageResource (проверено? checkedImageRes: defImageRes);  setOnClickListener (это);  } @Override public void onClick (View v) {проверено =! Проверено;  setImageResource (проверено? checkedImageRes: defImageRes);  onCheckedChangeListener.onCheckedChanged (это проверено);  } public void setOnCheckedChangeListener (OnCheckedChangeListener onCheckedChangeListener) {this.onCheckedChangeListener = onCheckedChangeListener;  } общедоступный статический интерфейс OnCheckedChangeListener {void onCheckedChanged (View buttonView, логическое isChecked);  }}  

Добавить этот атрибут —

        

Используйте подобное —

    

Это исправит все ваши проблемы.


2

Другой вариант — используйте ToggleButton с пустым фоном и настраиваемой кнопкой.

Ниже приведен пример, который также включает селектор для цвета текста.

  

toggle_selector.xml

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

toggle_text.xml

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

Поделиться
Улучшите этот ответ
отредактировано 31 марта 2017 в 15:28
ответил 06 октября 2015, в 8:19
добавить комментарий |

Другой вариант — использовать ToggleButton с нулевым фоном и настраиваемой кнопкой.

Ниже пример, который также включает селектор цвета текста..

   

toggle_selector.xml

    

toggle_text.xml

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

2

Если вы используете пользовательские адаптеры, чем android : focusable = "false" и android: focusableInTouchMode = "false" необходимы для того, чтобы сделать элементы списка доступными для щелчка при использовании флажка.

    

В drawable>checkbox_layout.xml

        

Поделиться
Улучшить этот ответ
отредактировано 6 января ’19 в 18:13
mehdi
18422 серебряных знака1515 бронзовых знаков
ответил 11 июня ’18 в 07:49
добавить комментарий |

Если вы используете пользовательские адаптеры, кроме android: focusable = "false" и android: focusableInTouchMode = "false" не требуется, чтобы элементы списка становились интерактивными при использовании флажка.

    

В drawable> checkbox_layout.xml

      селектор>  

2

Если вы используете androidx.appcompat: appcompat и хотите, чтобы для работы работал настраиваемый чертеж (типа selector с android: state_checked ) на старых версиях платформы в дополнение к новым версиям платформы необходимо использовать

   

вместо

   

Поделиться
Улучшите этот ответ
отредактировал 7 февраля ’20 в 8:15
ответил 06 февраля ’20 в 13:09
добавить комментарий |

Если вы используете androidx.appcompat: appcompat и хотите настраиваемый чертеж (типа selector с android: state_checked ) для работы со старыми версиями платформы в дополнение к новым версиям платформы вам необходимо использовать

   

вместо

   

2

На основе ответов Энселика и Рахула.

У меня работает (до и после API 21):

    

Поделиться
Улучшите этот ответ
ответил 5 мая ’20 в 22:58
добавить комментарий |

На основе ответов Энселика и Рахула.

У меня работает (до и после API 21):

    

Оцените статью
Botgadget.ru
Добавить комментарий