为啥 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() 只作用于一个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

在相机预览中不工作 setAlpha

为啥有时这不起作用?

可绘制的 setAlpha 在 android 4.4.2 上不起作用

为啥 FindWindowEx 找不到我的所有按钮?

为啥我的按钮不起作用?

为啥这不适用于我的 Discord 机器人?