Android - 自定义多击图像复选框

时间:2014-04-17 09:50:16

标签: android image mobile checkbox statelist

我想创建一个具有四种不同状态的自定义复选框:

  • 未选中(空复选框)
  • 已检查(绿色检查)
  • 不可用(红十字会)
  • 部分不可用(橙色支票)

我确实找到here如何创建一个包含自定义图像的复选框(按下状态,聚焦,悬停和默认)。但我想要的是一种在四种状态之间循环的方法如下:

  1. 按一次:它是绿色的;
  2. 按两次:这是一个红十字会;
  3. 价格三次:检查橙色;
  4. 按四次:再次取消选中。
  5. PS:我知道在Android应用程序中可能更容易只使用4个状态下拉或者弹出一个选择其中一个状态的弹出窗口。但我希望在这两个中,上面的第三个选项,因此用户可以自己决定他们喜欢哪三个设置。

    PSS:当我输入这个时,我想出了一个带有未经检查图像的按钮的想法,当你点击它时它会将image-src替换为下一个,同时保持其他一切(如宽度) /高度和边距/填充)。对于这种情况,这是最好的方法,还是有人有更优雅的解决方案呢?

    提前感谢您的回复。

1 个答案:

答案 0 :(得分:0)

正如PSS中所述,当我输入上述问题时,我只有解决方案的想法。我使用了一个ImageButton,当它被点击时会改变它的来源。这是代码:

xml中的ImageButton:

<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;
                }
            }
        });
    }

    ...
}