2013-04-18 48 views
0

我在嘗試爲自定義視圖的寬度設置特定的大小時遇到​​了問題。我知道我可以在XML文件的layout_width字段中硬編碼一個值,但我試圖不導致硬編碼值。我需要我的View爲屏幕大小的一半。因此,class內我發現屏幕尺寸的一半:如何指定自定義視圖的寬度?

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 
    try{ 
     Point size = new Point(); 
     display.getSize(size); 
     screenWidth = size.x; 
    }catch(NoSuchMethodError e){ 
     screenWidth = display.getWidth(); 
    } 

然後,我打電話:

measure(width|MeasureSpec.EXACTLY, LayoutParams.WRAP_CONTENT|MeasureSpec.EXACTLY); 
//Where width is equal to half the screen width 

但這似乎並沒有工作我的情況。 所以,總結一下,你如何正確指定一個特定的尺寸爲自定義View?任何幫助將有用和讚賞!謝謝!

回答

0

重寫onMeasure()方法在您的自定義視圖:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int width = getResources().getDisplayMetrics().widthPixels >> 1; 
    widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

基本上覆蓋寬度MeasureSpec是在屏幕的正好一半的寬度,然後傳遞通過對超類。

0

我相信您可能無法準確獲得屏幕寬度,因爲您需要等到整個層次結構(直到最根視圖)佈局爲止。你可能需要做一些事情,如:

ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 

      int width = getWidth(); 
      int height = getHeight(); 
      //set layoutparams with those values. 
      } 
     }; 

getViewTreeObserver().addOnGlobalLayoutListener(layoutListener); 

您可以通過查看確認此正確性,如果當你嘗試讓onMeasure內的顯示寬度,你得到的值與值不同,你當onGlobalLayout回調被調用。

+0

那麼,我能夠以像素爲單位獲得屏幕寬度的大小。我遇到的問題是,當我調用'measure(int width,int height)'方法時,它似乎沒有使View的值與指定的值相對應。我會更新我的問題,我如何收到屏幕大小。 – chRyNaN

相關問題