切换视图背景

时间:2011-03-01 21:22:59

标签: android view

我的Activity上有一个View对象,我想更改视图的后台资源。更具体地说,我想切换它。

所以我需要这样的逻辑:

if (myView.getBackgroundResource() == R.drawable.first) {
  myView.setBackgroundResource(R.drawable.second);
}
else {
  myView.setBackgroundResource(R.drawable.first);
}

这里的问题是没有getBackgroundResource()方法。

如何获取View用于其背景的资源?

5 个答案:

答案 0 :(得分:0)

仅仅拥有一个维持状态的控制变量会不会更容易?让您灵活,并允许您任意数量的drawables。

int[] backgrounds = {
    R.drawable.first,
    R.drawable.second,
    R.drawable.third
};

int currentBg;

void switch() {
    currentBg++;
    currentBg %= backgrounds.length;

    myView.setBackgroundResource(backgrounds[currentBg]);
}

答案 1 :(得分:0)

您可以使用标记来跟踪最后设置的内容

private static final int FIRST_BG = 0;
private static final int SECOND_BG = 1;

private int mCurrentBg;

...

if (mCurrentBg == FIRST_BG) {
  myView.setBackgroundResource(R.drawable.second);
  mCurrentBg = SECOND_BG;
}
else {
  myView.setBackgroundResource(R.drawable.first);
  mCurrentBg = FIRST_BG;
}

您必须在最初设置背景的地方初始化mCurrentBg

答案 2 :(得分:0)

我不认为View会记住从资源获取Drawable后它使用的资源。

为什么不在Activity中使用实例变量,或者为View 创建子类并向其添加实例变量?

答案 3 :(得分:0)

您可以通过getResources().getIdentifier("filename", "drawable", "com.example.android.project");功能获取资源的ID。如您所见,您将需要文件名,资源类型(可绘制,布局或其他)以及它所在的包。

答案 4 :(得分:0)

编辑:更新了我的逻辑失败。

我认为您可以在此处使用setTag()getTag()方法:

//set the background and tag initially
View v = (View)findViewById(R.id.view);
v.setBackgroundResource(R.drawable.first);
v.setTag(R.drawable.first);


if(v.getTag().equals(R.drawable.first)) {
    v.setBackgroundResource(R.drawable.second);
    v.setTag(R.drawable.second);
} else {
    v.setBackgroundResource(R.drawable.first);
    v.setTag(R.drawable.first);
}

我没有对此进行过测试,但我认为理论上应该可行。缺点是你必须在第一次手动标记它时增加一点开销,但在初始标记之后,你不必担心跟踪标记。