为啥 setAlpha() 作用于我的所有按钮,而 setImageResource() 只作用于一个按钮?
Posted
技术标签:
【中文标题】为啥 setAlpha() 作用于我的所有按钮,而 setImageResource() 只作用于一个按钮?【英文标题】:Why does setAlpha() act on all my buttons whilst setImageResource() acts on just one button?为什么 setAlpha() 作用于我的所有按钮,而 setImageResource() 只作用于一个按钮? 【发布时间】:2011-12-22 19:20:06 【问题描述】:目前我的按钮不起作用。前两次 any 被按下,所有按钮都会受到影响,而不仅仅是被按下的那个。
交换:
seatButton[i].setAlpha(255);
为:
seatButton[i].setImageResource(0x7f020007)
我的代码有效!只有我按下的按钮有效。为什么?
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
table = new Table(); //Creates Table
seatButton = new ImageButton[10]; //Creates Array of buttons
seatStats = new TextView[10]; //Creates array for stat panels
//Creates longClickListener, used for players to sit in or out.
longClickListener = new View.OnLongClickListener()
@Override
public boolean onLongClick(View v)
for(int i=0; i<10; i++)
//Each seat[i] will correspond with each imageButtoni+1
if(v.getId() == (getResources().getIdentifier("imageButton" + (i+1), "id", "en.deco.android.livehud")))
//If the seat is empty fill it, place a player in the seat and change the button from translucent to opaque
if(table.seats[i].getState().equals("empty"))
seatButton[i].setAlpha(255);
//seatButton[i].setImageResource(0x7f020000);
table.seats[i].sit(new Player());
seatStats[i].setVisibility(View.VISIBLE);
Toast.makeText(GUI.this, table.seats[i].getState(), Toast.LENGTH_SHORT).show();
//If the seat is full, empty it
else
seatButton[i].setAlpha(80);
//seatButton[i].setImageResource(0x7f020007);
table.seats[i].sitOut();
seatStats[i].setVisibility(View.INVISIBLE);
Toast.makeText(GUI.this, table.seats[i].getState() + i, Toast.LENGTH_SHORT).show();
return true;
;
//Assigns the buttons and stats panels defined in the layout xml to their appropiate java arrays. Also sets clickListeners to buttons.
for(int i = 0; i < 10; i++)
seatButton[i] = (ImageButton) findViewById(getResources().getIdentifier("imageButton" + (i+1), "id", "en.deco.android.livehud"));
seatStats[i] = (TextView) findViewById(getResources().getIdentifier("textView" + (i+1), "id", "en.deco.android.livehud"));
seatButton[i].setOnLongClickListener(longClickListener);
seatButton[i].setAlpha(80);
【问题讨论】:
【参考方案1】:您正在与==
进行字符串比较,这意味着您正在比较引用而不是值。这可能不是您想要的,因此您应该将其更改为:
if(table.seats[i].getState() == "empty") ...
到:
if(table.seats[i].getState().equals("empty")) ...
另外,根据setAlpha(float alpha)
的文档(这是一个API 11的方法,仅供参考),传递的float应该在[0...1]
之间。
您设置的图像资源是 ImageManager 的R.id.transparent_background
。这可能表明您的逻辑有效,但错误确实存在于设置 alpha 值的某个地方。
【讨论】:
感谢这确实是一个错误,尽管按钮前两次单击的问题仍然存在。 用可能不正确的 setAlpha 调用扩展了我的答案。 对于 ImageView/ImageButtons,Alpha 值是从 0..255 开始的整数。我的最后一次尝试是将 setAlpha 替换为 Alpha 动画。不幸的是,这也失败了。第一次单击会很好,但第二次会影响所有按钮。开始认为 Alpha 方法本身可能有点狡猾。 啊,是的,我注意到 ImageView/ImageButton 有自己的 setAlpha(int)。尽管如此,您是否尝试过从 View 基类继承的 setAlpha(float) 方法?或者,您可以浏览建议 here 和 here。 我已经尝试过上述方法之一。稍后我将尝试使用 textView,当我使用 imageButton 时,我将不得不为 imageView 提供一个等效项。 setAlpha(float) 在应用于 imageButton 时返回错误。我昨晚找到了解决这个问题的方法,我稍后也会提出来。我对解决方案并不满意,因为它与问题一样没有意义。希望我的混乱解决方案可以帮助揭示这里发生的事情,以便找到真正的解决方案。【参考方案2】:我找到了解决方案,但我不明白,也不满意。我设置了一个 alpha 动画,在打开程序时将所有按钮的 alpha 值从 255 更改为 255。换句话说,它什么也不做。但是我的程序现在可以工作了。我会欢迎更好的解决方案或解释为什么会这样?
此代码与其余的初始化一起放在 onCreate() 方法的开头。它设置了一个保持相同值的 AlphaAnimation。
//Initializes AlphaAnimations to alter transparency
alphaDown = new AlphaAnimation(1f, 1f);
alphaDown.setDuration(1000);
alphaDown.setFillAfter(true);
这是在我的问题底部显示的相同循环,其中一行更改了。在将我的所有按钮设置为半透明之前,它会激活此静止动画。如果没有此动画,所有按钮都会一键受到影响。通过动画,每个按钮都会在它被点击时做出响应。
//Assigns the buttons and stats panels defined in the layout xml to their appropiate java arrays. Also sets clickListeners to buttons.
for(int i = 0; i < 10; i++)
seatButton[i] = (ImageButton) findViewById(getResources().getIdentifier("imageButton" + (i+1), "id", "en.deco.android.livehud"));
seatStats[i] = (TextView) findViewById(getResources().getIdentifier("textView" + (i+1), "id", "en.deco.android.livehud"));
seatButton[i].setOnLongClickListener(longClickListener);
seatButton[i].startAnimation(alphaDown);
seatButton[i].setAlpha(80);
【讨论】:
这是一个没有奏效的临时解决方案。我后来遇到了类似的问题,点击完全不相关的按钮会反转透明度。以上是关于为啥 setAlpha() 作用于我的所有按钮,而 setImageResource() 只作用于一个按钮?的主要内容,如果未能解决你的问题,请参考以下文章