0

다음 코드를 사용하여 버튼을 부풀려서 간단하게 TranslateAnimation을 사용하여 선택한 2 개의 버튼의 위치를 ​​바꾸고 싶습니다.Android : 팽창 된 버튼의 ID 찾기

번호 :

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

로그 캣 :

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, 그것은 사용자가 첫 번째 버튼을 누를 것이다했음을 의미한다면 스왑 용으로 아직 준비되지 않았으므로 ID와 해당 X, Y 좌표를 기록해야합니다. % 2 == 0을 선택하면 사용자가 2 개의 버튼을 눌러 2 번째 X 및 Y를 기록한 후 교체 할 준비가되었음을 의미합니다.

또한 (X1, Y1) 및 (X2, Y2) .

이것은 426 btn_right.clearAnimation(); (위에서 지정한대로)의 NPE로 실행됩니다. 내 질문은, 모든 버튼이 부풀려 졌기 때문에, 그리고 나는 팽창 된 모든 버튼에 대해 이미 설정했기 때문에, 라인 426에서 NPE가 여전히 부족한 것인데, 실제로 사용자가 터치 한 2 개의 버튼을 어떻게 지정해야합니까? 스와핑 애니메이션을 구현하는 방법은 무엇입니까?

감사합니다.

답변

0

, 버튼의 목록을 만들려면이 버튼을 생성하고 다음과 같이 자신의 ID, 태그 및 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); 
    } 

그리고 당신은 다시 버튼을 사용 할 때 목록에서 ID 또는 태그를 호출하십시오. (buttonList.get(0).getId())

다른 청취자가 필요하면 함수 인 경우 고유 태그 체크 인을 사용하여 제어하고 다른 동작을 선언 할 수 있습니다.

동적 뷰에서 프로그래밍 방식으로 애니메이션을 만들고 사용해야 할 때 항상 사용하는 방법입니다.