如果ImageView drawable等于已知的drawable

时间:2014-07-29 19:59:36

标签: android

我有一个以编程方式设置其imageresource的imageview。这个图像可以通过3个drawable中的任何一个设置其资源,这可以使用类中较早的各种变量来选择。 3个抽签是:

R.drawable.well_done
R.drawable.try_again
R.drawable.sorry_failed

当我点击这张图片时,它可能会将这三个drawable中的任何一个设置为它,所以我试图按照这种方式运行一个方法(我知道这是完全错误的,但它可能帮助想象我想要做的事情)

public void game(){
    //STUFF
    if(result>10){
    imgView.setImageResource(R.drawable.well_done);}
    //MORE STUFF
}

public void results_page(){
    if(imgView=R.drawable.well_done){
        //DO STUFF
    }
    if(imgView=R.drawable.try_again){
        //DO STUFF
    }
    //etc...
}

这是我的正确代码。它比我上面的垃圾可视化要复杂得多,但我希望你能理解我想要做的事情。

    ImageView iv_i;
//...
...onCreate(Bundle savedInstanceState){
    //...
    result1.setOnClickListener(onClL);
    result2.setOnClickListener(onClL);
}

private void game() {
    //...
    result1.setImageResource(R.drawable.well_done);
    result1.setTag(R.drawale.well_done)
    result2.setImageResource(R.drawable.try_again);
    result2.setTag(R.drawable.try_again);
    //...
}

private OnClickListener onClL = new OnClickListener() {
    @Override
    public void onClick(View v) {

        switch(v.getId()){
            case R.id.result1:
            ic_i = result1;
            iv_i.setTag(result1.getTag());

            break;
            case R.id.result2:
            iv_i = result2;
            ic_i.setTag(result2.getTag());
            break;

        }

        gotoResource();
    }
};


private void gotoResource(){
    Integer integer = (Integer) iv_i.getTag();
    switch(integer){
        case R.drawable.well_done:
        //STUFF
        break;
        case R.drawable.try_again:
        //STUFF
        break;
        case R.drawable.sorry:
        //STUFF
        break;
    }
}

当我运行此操作时,我在包含iv_i.setTag(result1.getTag());的行中得到nullpointerexception

我出了什么问题?或者我该如何正确地做到这一点,或者另一种做得更容易的方式呢?也许将drawable转换为字符串,然后对字符串执行if语句,如:(也知道这是完全错误的,但它仅用于可视化)

String resource = imgView.getDrawable().toString();
if(resource.equals("R.drawable.well_done")){
//DO SOMETHING
}

由于

1 个答案:

答案 0 :(得分:1)

我建议在ImageView上设置一个标签来指示它所处的状态。我最近在类似的问题上使用这种方法(确定一个按钮是否处于活动状态),而不是依赖于ImageView所具有的精确可绘制性。它适用于我。

private static enum MessageViewType { SUCCESS, TRY_AGAIN, FAILURE }

public void game(){
    //STUFF
    if (result > 10){
        imgView.setImageResource(R.drawable.well_done);}
        imgView.setTag(R.id.image_view_status, MessageViewType.SUCCESS); // define image_view_status as a resource
    }
    //MORE STUFF
}

...

private void gotoResource(){
    MessageViewType messageType = (MessageViewType) iv_i.getTag(R.id.image_view_status);
    if (messageType == MessageViewType.SUCCESS) {
        //STUFF
    } else if (messageType == MessageViewType.TRY_AGAIN) {
        // STUFF
    } else if (messageType == MessageViewType.FAILURE) {
        //STUFF
    }
}

您可以在任何资源文件中定义image_view_status ID。我个人使用文件res> values> activity_resources.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="image_view_status" type="id" />
</resources>