2014-02-21 224 views
36

我設計了一個佈局,其中LinearLayout有兩個孩子LinearLayoutFrameLayout,並且在每個孩子中我放置了不同的視圖。以編程方式獲取佈局的高度和寬度

我只是想測量高度和寬度的FrameLayout,以便我可以爲我的目的服務。

在程序我使用

int height,width; 

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); 
height=fr.getHeight(); 
width=fr.getWidth(); 

返回值作爲0兩個

即使我試圖與下面的代碼 INT高度,寬度;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); 
height=fr.getMeasuredHeight(); 
width=fr.getMeasuredWidth(); 

返回相同的值0

最後我試圖與下面的代碼, INT高度,寬度;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); 
height=fr.getgetLayoutParams().height(); 
width=fr.getLayoutParams().width; 

返回我-2-1

我想要的解決方案,使編程任何佈局的高度和寬度?

+0

看到這個問題 http://stackoverflow.com/questions/3779173/determining-the-size-of-an-android-view-at-runtime – VinhNT

回答

80

的觀點本身有它自己的生命週期基本上是如下:

-Attached

-Measured

-layout

-draw

所以,根據你什麼時候想要獲得寬度/高度,你可能看不到你期望看到的,例如,如果你在onCreate期間這樣做,那麼視圖可能甚至沒有在那個時間被測量,在另一個時間如果你在按鈕的onClick方法中這樣做,那麼很可能是那個視圖已經被附加,測量,佈局和繪製,所以,你會看到預期值,你應該實現一個ViewTreeObserver來確保你獲得了值在適當的時刻。

LinearLayout layout = (LinearLayout)findViewById(R.id.YOUD VIEW ID); 
ViewTreeObserver vto = layout.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
       this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } else { 
       this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     int width = layout.getMeasuredWidth(); 
     int height = layout.getMeasuredHeight(); 

    } 
}); 

希望它有助於。

問候!

+0

THnx爲您的答案....但仍然相同的結果:( – Rohit

+1

請注意,removeGlobalOnLayoutListener已棄用,所以你必須寫this.layout。。getViewTreeObserver()removeOnGlobalLayoutListener(本);在最近的android api中。 –

+0

它像一個魅力:) – boctulus

1

第一個片段是正確的,但您需要在onMeasure()之後調用執行。否則,該視圖的大小尚未測量。

+0

此外,您可以覆蓋onMeasure得到了新的每次調用這個方法時測量的結果。 –

11

我認爲你在OnCreate()方法中獲得高度和寬度,這就是爲什麼你始終得到0值,因爲那時你的視圖還沒有創建。

設法得到高度和寬度上的一些按鈕,點擊不然..

+0

我有幾乎相同的問題。我是Android的初學者。那麼做什麼最好的/方式的地方是什麼?目前我在onCreate中創建了幾個按鈕,並且想要定位它們。哪裏是最好的地方去做? –

1

對於框架:

height=fr.getHeight(); 
width=fr.getWidth(); 

對於屏幕:

width = getWindowManager().getDefaultDisplay().getWidth(); 
height = getWindowManager().getDefaultDisplay().getHeight(); 
0

嘗試這樣的事情代碼this鏈接

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); 
if (viewTreeObserver.isAlive()) { 
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    viewWidth = view.getWidth(); 
    viewHeight = view.getHeight(); 
} 
}); 
} 

希望這會有所幫助。

0

我用DisplayMetrics獲取屏幕尺寸,然後我可以在%年齡寬度/高度指定給一個元素

它會像這樣

DisplayMetrics dmetrics = new DisplayMetrics(); 
int widthPixels=dmetrics.widthPixels; 
int heightPixels=dmetrics.heightPixels;  

//setting the height of the button 
button_nextPuzzle.setMinHeight((int) ((heightPixels/3)*.30)); 

爲我工作得非常好! !

+0

它不會給你所需的高度'FrameLayout' – Prabs

5

如果您得到-1或-2,它也可能是LayoutParams.WRAP_CONTENT(-2)或LayoutParams.MATCH_PARENT(-1)的數值。

7

由於CapDroid,你想喲,如果得出的觀點之前獲得的大小,另一種可能的解決辦法是做一個帖子有一個可運行的查看:

mView.post(new Runnable() { 
     @Override 
     public void run() { 
      int width = mView.getWidth(); 
      int height = mView.getHeight(); 
     } 
} 
1

最簡單的方法是使用ViewTreeObserver ,如果您直接使用.height或.width,則您將值設爲0,因爲視圖在屏幕上繪製之前不具有大小。下面的例子將展示如何,如果你需要使用此方法上,這樣使用和保存的值,可以使用全地球變量使用ViewTreeObserver

ViewTreeObserver viewTreeObserver = YOUR_VIEW_TO_MEASURE.getViewTreeObserver(); 
     if (viewTreeObserver.isAlive()) { 
      viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 

        YOUR_VIEW_TO_MEASURE.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
        int viewHeight = YOUR_VIEW_TO_MEASURE.getHeight(); 
        int viewWeight = YOUR_VIEW_TO_MEASURE.getWidth(); 

       } 
      }); 
     } 

0

只是給你的身高,如果你想要的話,你會得到高度,甚至寬度。

/** * 獲取視圖高度視圖前將呈現 * @參數查看測量 視圖* @返回視圖的高度 */

public static int getViewHeight(View view) { 
    WindowManager wm = 
      (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 

    int deviceWidth; 

    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ 
     Point size = new Point(); 
     display.getSize(size); 
     deviceWidth = size.x; 
    } else { 
     deviceWidth = display.getWidth(); 
    } 

    int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST); 
    int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
    view.measure(widthMeasureSpec, heightMeasureSpec); 
    return view.getMeasuredHeight(); //  view.getMeasuredWidth(); 
} 
0

我有同樣的問題但是在測量之前並不想在屏幕上繪製,所以我使用這種測量視圖的方法來試圖獲取高度和寬度。 )

layoutView(view); 

INT高度= view.getHeight(;:使用

示例

void layoutView(View view) { 
view.setDrawingCacheEnabled(true); 
int wrapContentSpec = 
MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 
view.measure(wrapContentSpec, wrapContentSpec); 
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 
} 
相關問題