2013-10-16 46 views
1

我試圖在RelativeLayout中動態放置幾個按鈕。問題是,即使認爲x和y座標正確計算,所有按鈕都放置在相同的位置。使用LayoutParams和設置marginRightmarginBottom指定座標是否正確?在RelativeLayout中的特定位置動態放置按鈕

代碼:

layout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
     { 
      @Override 
      public void onGlobalLayout() 
      { 
       layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 

       RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(BUTTON_WIDTH, BUTTON_HEIGHT); 

       int currentX = 20; 
       int currentY = 20; 

       for (Product product: controller.getProducts("pizza")){ 

        Log.d(TAG, "CurrentY: " + currentY); 
        Log.d(TAG, "CurrentX: " + currentX); 

        Button tempButton = new Button(getActivity()); 
        tempButton.setId(product.getId()); 
        tempButton.setText(product.getName()); 

        layoutParams.rightMargin = currentX; 
        layoutParams.bottomMargin = currentY; 
        tempButton.setLayoutParams(layoutParams); 

        layout.addView(tempButton); 

        if (layout.getWidth() < currentX + MARGIN_LEFT + BUTTON_WIDTH){ 
         currentX = 20; 
         currentY += BUTTON_HEIGHT + MARGIN_BOTTOM; 
        } 
        else{ 
         currentX += MARGIN_LEFT + BUTTON_WIDTH; 
        } 


       } 

      } 
     }); 

回答

1

我已經發現的錯誤。似乎我每次通過循環都必須重新實例化LayoutParams,但僅使用相同的LayoutParams實例設置邊距屬性是不夠的。我認爲在調用addView()方法後立即將按鈕添加到指定的佈局,但實際上它在末尾(方法結束時)執行它,因爲它將所有按鈕放在相同(最後一個)座標處。

代碼:

layout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    { 
     @Override 
     public void onGlobalLayout() 
     { 

      layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 

      RelativeLayout.LayoutParams layoutParams; 

      int currentX = 20; 
      int currentY = 20; 

      for (Product product: controller.getProducts("pizza")){ 

       layoutParams = new RelativeLayout.LayoutParams(BUTTON_WIDTH, BUTTON_HEIGHT); 

       Button tempButton = new Button(getActivity().getApplicationContext()); 
       tempButton.setId(product.getId()); 
       tempButton.setText(product.getName()); 

       layoutParams.setMargins(currentX, currentY, 0, 0); 
       tempButton.setLayoutParams(layoutParams); 

       layout.addView(tempButton); 



       if (layout.getWidth() < currentX + MARGIN_LEFT + (2 * BUTTON_WIDTH)){ 
        currentX = 20; 
        currentY += BUTTON_HEIGHT + MARGIN_BOTTOM; 
       } 
       else{ 
        currentX += MARGIN_LEFT + BUTTON_WIDTH; 
       } 


      } 

      //layout.requestLayout(); 

     } 
    }); 
+0

如何,我可以得到'BUTTON_WIDTH,BUTTON_HEIGHT,MARGIN_BOTTOMMARGIN_LEFT'我也wnated動態地放置多個按鈕。你能幫我麼。你的代碼真的幫助我很多。請進一步指導我。我是Android新手。 –