Почему setAlpha() действует на все мои кнопки, а setImageResource() действует только на одну кнопку?

В данный момент у меня не работают кнопки. Первые два нажатия любой кнопки влияют на все кнопки, а не только на ту, которая была нажата.

Менять:

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

person Declan McKenna    schedule 05.11.2011    source источник


Ответы (2)


Вы выполняете сравнение строк с ==, что означает, что вы сравниваете ссылки, а не значения. Это, вероятно, не то, что вы хотите, поэтому вы должны изменить это с:

if(table.seats[i].getState() == "empty") { ... }

to:

if(table.seats[i].getState().equals("empty")) { ... }

Кроме того, согласно документации setAlpha(float alpha) (это метод API 11, просто для справки), переданное число с плавающей запятой должно быть между [0...1].

Ресурс изображения, который вы устанавливаете, — это файл ImageManager R.id.transparent_background. Это может означать, что ваша логика работает, но ошибка действительно где-то в установке альфа-значения.

person MH.    schedule 05.11.2011
comment
Спасибо, это действительно ошибка, хотя проблема с первыми двумя нажатиями кнопки все еще возникает. - person Declan McKenna; 06.11.2011
comment
Дополнил мой ответ, возможно, неверным вызовом setAlpha. - person MH.; 06.11.2011
comment
Альфа-значения — это целые числа от 0 до 255 для ImageView/ImageButtons. Моя последняя попытка заключалась в замене setAlpha на альфа-анимацию. К сожалению, это тоже не удалось. Первый щелчок будет в порядке, но второй повлияет на все кнопки. Начинать думать, что сами альфа-методы могут быть немного хитрыми. - person Declan McKenna; 06.11.2011
comment
Ах да, я заметил, что у ImageView/ImageButton есть собственный setAlpha(int). Тем не менее, пробовали ли вы использовать метод setAlpha(float), унаследованный от базового класса View? Кроме того, вы можете просмотреть предложения здесь и здесь. - person MH.; 06.11.2011
comment
Я пробовал один из вышеперечисленных. Я дам textView один позже, мне нужно будет придумать эквивалент для imageView, поскольку я использую imageButton. setAlpha(float) возвращает ошибку при применении к imageButton. Я нашел способ решить это прошлой ночью, я также выложу позже. Я даже отдаленно не доволен решением, так как оно имеет так же мало смысла, как и проблема. Надеюсь, мое запутанное решение поможет раскрыть, что здесь происходит, чтобы можно было найти реальное решение. - person Declan McKenna; 06.11.2011

Я нашел решение, но я не понимаю его и не доволен им. Я настроил альфа-анимацию, которая изменила альфа-значение всех моих кнопок с 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);
    }
person Declan McKenna    schedule 06.11.2011
comment
Это было временное решение, которое не сработало. Позже я столкнулся с аналогичными проблемами: нажатие совершенно не связанных кнопок меняет прозрачность. - person Declan McKenna; 21.03.2012