Android - Пользовательский флажок с несколькими кликами с изображениями

Я хочу создать пользовательский флажок с четырьмя различными состояниями:

  • Не отмечено (пустой флажок)
  • Проверено (зеленая галочка)
  • Недоступно (красный крест)
  • Частично недоступен (оранжевый флажок)

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

  1. нажмите один раз: он отмечен зеленым;
  2. нажмите дважды: это красный крест;
  3. цена трижды: проверено оранжевым;
  4. нажмите четыре раза: снова не проверено.

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

PSS: в то время как я набираю это, мне пришла в голову идея кнопки с непроверенным изображением, и когда вы щелкаете по ней, она заменяет image-src на следующее, сохраняя все остальное таким же (как ширина / высота и Запас / обивка). Это лучший подход в этой ситуации, или у кого-то есть более элегантное решение?

Заранее спасибо за ответы.

1 ответ

Решение

Как указано в PSS, у меня была идея для решения, когда я печатал вопрос выше. Я использовал ImageButton, который меняет свой источник при нажатии. Вот код:

ImageButton в xml:

<ImageButton
    android:id="@+id/ibtnCheckbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/checkbox_content_description"
    android:src="@drawable/checkbox_unchecked"
    android:background="@drawable/transparent_button_background" />

transparent_button_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@android:color/transparent" />
    <item android:state_pressed="true" android:drawable="@android:color/transparent" />
    <item android:drawable="@android:color/transparent" />
</selector>

Деятельность:

public class MainActivity extends ActionBarActivity {
    private ImageButton cbButton;
    private int status;
    private int checkbox_images[] = {
        R.drawable.checkbox_unchecked,
        R.drawable.checkbox_checked,
        R.drawable.checkbox_error,
        R.drawable.checkbox_partly
    };

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

        status = 0;
        addListenerToButton();
    }

    private void addListenerToButton(){
        cbButton = (ImageButton) findViewById(R.id.ibtnCheckbox);
        cbButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                switch(status){
                    // Unchecked -> Green checked
                    case 0:
                    // Green checked -> Red cross
                    case 1:
                    // Red cross -> Orange-yellow checked
                    case 2:
                        cbButton.setImageResource(checkbox_images[++status]);
                        break;
                    // Orange-yellow checked -> Unchecked
                    case 3:
                        cbButton.setImageResource(checkbox_images[status = 0]);
                        break;
                    // Default (just in case)
                    default:
                        status = 0;
                        cbButton.setImageResource(checkbox_images[status++]);
                        break;
                }
            }
        });
    }

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