Android: найдите идентификатор надутых кнопок
Я раздул кнопки, используя следующие коды, и хотел бы поменять местами 2 кнопки, выбранные с помощью простых TranslateAnimation
,
коды:
for (int k = 1; k <= quotient; k++)
{
LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(button_width,row_height);
params3.setMargins(button_margin, button_margin, button_margin, button_margin);
btn_right = new Button(this);
btn_right.setId(idd);
final int id_ = btn_right.getId();
btn_right.setText(""+question[idd]);
frame_row.addView(btn_right, params3);
btn_right.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
btn_right = ((Button) findViewById(id_));
X1 = getRelativeLeft(btn_right);
Y1 = getRelativeTop(btn_right);
int b = Integer.parseInt(""+btn_right.getText().toString());
selection ++;
if (selection%2 ==1)
{
selected_id1 = id_;
selected_color1 = b;
custom_toast("X1=" +X1 + "\nY1=" + Y1);
}
else
{
selected_id2 = id_;
selected_color2 = b;
X2 = getRelativeLeft(btn_right);
Y2 = getRelativeTop(btn_right);
custom_toast("X2=" +X2 + "\nY2=" + Y2);
// the first one
btn_right = ((Button) findViewById(selected_id1));
anim1=new TranslateAnimation(0, (X2-X1), 0, (Y2-Y1));
anim1.setFillAfter(true);
anim1.setDuration(animationTime);
anim1.setAnimationListener(Game.this);
btn_right.startAnimation(anim1);
// the second one
btn_right = ((Button) findViewById(selected_id2));
anim2=new TranslateAnimation(0, (X1-X2), 0, (Y1-Y2));
anim2.setFillAfter(true);
anim2.setDuration(animationTime);
anim2.setAnimationListener(Game.this);
btn_right.startAnimation(anim2);
}
@Override
public void onAnimationEnd(Animation animation)
{
if (animation == anim1)
{
custom_toast("1 clear");
btn_right = ((Button) findViewById(selected_id1));
btn_right.clearAnimation(); // Line 426
}
if (animation == anim2)
{
custom_toast("2 clear");
btn_right = ((Button) findViewById(selected_id2));
btn_right.clearAnimation();
}
}
Logcat:
04-21 21:28:00.728: E/AndroidRuntime(11341): java.lang.NullPointerException
04-21 21:28:00.728: E/AndroidRuntime(11341): at com.abc.abc.Game.onAnimationEnd(Game.java:426)
Вопрос:
Для информации, если выбор%2 ==1, это означает, что пользователь нажал только первую кнопку и еще не готов к обмену, и, следовательно, для записи идентификатора и его координат X, Y. Если выбор%2 ==0, это означает, что пользователь нажал 2 кнопки и готов поменяться местами после записи 2-го X и Y.
Кроме того, координаты (X1, Y1) и (X2, Y2) сообщаются правильно.
Он сталкивается с NPE на линии 426 btn_right.clearAnimation();
(как указано выше) . Мой вопрос заключается в том, что, поскольку все кнопки раздуты, и я уже установил ID для всех раздутых кнопок, почему он по-прежнему работает как NPE в строке 426, или на самом деле, как мне указать 2 кнопки, к которым пользователь прикоснулся, так как реализовать замену анимации?
Спасибо!!
1 ответ
Создать список кнопок, вы можете создавать кнопки и устанавливать их идентификаторы, теги и onclicklistenners, как это, и добавлять их в список кнопок:
buttonList = new ArrayList<Button>();
for (int i=0;i<2;i++){
Button button = new Button(getApplicationContext());
button.setOnClickListener(customListenner);
button.setAnimation(anim);
button.setId(i);
button.setTag(i);
myLayout.addView(button);
buttonList.add(button);
}
и когда вам нужно снова использовать кнопку, просто позвоните с их идентификатором или тегами из списка. (buttonList.get(0).getId()
)
Если вам нужны разные слушатели, вы можете управлять ими с помощью уникальной метки, проверить функцию if и объявить другое действие.
Это метод, который я всегда использую, когда мне нужно программно создавать и использовать анимацию в динамических представлениях.