2016-03-02 2 views
1

Я создаю программно несколько макетов, и мне нужно получить ширину одного из них, пересчитать это значение и изменить. Все это действие я делаю в onGlobalLayoutListener. Но когда я устанавливаю новое значение ширины, он не меняется.Получить ширину макета и установить значение новой ширины в onGlobalLayoutListener

private RelativeLayout batteryContainer; 
    private LinearLayout batteryLeftSide; 
    private LinearLayout batteryRightSide; 

    public void drawBattery(){ 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 

        //Контейнер всієї батарейки 
        batteryContainer = new RelativeLayout(activity); 
        RelativeLayout.LayoutParams batteryContainerParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
        batteryContainerParams.setMargins((int) convertDpToPixel(containerMarginLeft), (int) convertDpToPixel(containerMarginTop), (int) convertDpToPixel(containerMarginRight), (int) convertDpToPixel(containerMarginBottom)); 
        if(layoutBelow != null){ 
         batteryContainerParams.addRule(RelativeLayout.BELOW, layoutBelow.getId()); 
        } 
        if(layoutAbove != null){ 
         batteryContainerParams.addRule(RelativeLayout.ABOVE, layoutAbove.getId()); 
        } 
        batteryContainer.setLayoutParams(batteryContainerParams); 
        batteryContainer.setBackgroundColor(Color.parseColor("#505050")); 
        batteryContainer.setId(containerId); 

        int leftWidth = 0; 
        int rightWidth = 0; 

        //Ліва частина батарейки 
        batteryLeftSide = new LinearLayout(activity); 
        batteryLeftSide.setOrientation(LinearLayout.HORIZONTAL); 
        RelativeLayout.LayoutParams batteryLeftSideParams = new RelativeLayout.LayoutParams((int)convertDpToPixel(leftWidth), (int)convertDpToPixel(sideHeight)); 
        batteryLeftSideParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
        batteryLeftSide.setLayoutParams(batteryLeftSideParams); 
        batteryLeftSide.setBackgroundColor(Color.parseColor("#900000")); 
        batteryLeftSide.setId(leftSideId); 

        //Права частина батарейки 
        batteryRightSide = new LinearLayout(activity); 
        batteryRightSide.setOrientation(LinearLayout.HORIZONTAL); 
        RelativeLayout.LayoutParams batteryRightSideParams = new RelativeLayout.LayoutParams((int)convertDpToPixel(rightWidth), (int)convertDpToPixel(sideHeight)); 
        batteryRightSideParams.addRule(RelativeLayout.RIGHT_OF, batteryLeftSide.getId()); 
        batteryRightSide.setLayoutParams(batteryRightSideParams); 
        batteryRightSide.setBackgroundColor(Color.parseColor("#009900")); 
        batteryRightSide.setId(rightSideId); 

        //Додамо праві та ліві сторони в контейнер 
        batteryContainer.addView(batteryLeftSide); 
        batteryContainer.addView(batteryRightSide); 
        //Додамо контейнер в кореневий Layout на активності 
        rootLayout.addView(batteryContainer); 

        //Обчислення яка сторона батарейки займе 50% 
        ViewTreeObserver observer = rootLayout.getViewTreeObserver(); 
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
         @Override 
         public void onGlobalLayout() { 
          rootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
          int batteryContainerWidth = batteryContainer.getMeasuredWidth(); 
          int halfPlace = batteryContainerWidth * 50/100; 
          trustFromMe = halfPlace; 
          if(trustToMe > trustFromMe){ 
           batteryLeftSide.getLayoutParams().width = halfPlace; 
          } 
          if(trustToMe < trustFromMe){ 
           batteryRightSide.getLayoutParams().width = halfPlace; 
          } 
          if(trustToMe == trustFromMe){ 
           batteryLeftSide.getLayoutParams().width = halfPlace; 
           batteryRightSide.getLayoutParams().width = halfPlace; 
          } 
         } 
        }); 
        //but width not change 

       } 
      }); 
     } 

ответ

2

Попробуйте добавить это к концу GlobalLayoutListener:

rootLayout.requestLayout(); 

Это должно заставить макет перерисовывать его размер. Если это не сработает, вы можете попробовать создать и установить новые LayoutParams.

+0

Чувак, это волшебство) –

+0

Ницца! Ты спасаешь мой день! – kristyna

Смежные вопросы