首页 文章

以编程方式获取布局的高度和宽度

提问于
浏览
38

我设计了一个布局,其中 LinearLayout 有2个孩子 LinearLayoutFrameLayout ,在每个孩子中我都放了不同的视图 .

我只是想测量 FrameLayout 的高度和宽度,以便我可以达到我的目的 .

在我正在使用的程序中

int height,width;

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

两者都返回 0 的值

即使我尝试使用以下代码int height,width;

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

返回相同的值 0

最后我尝试使用以下代码,int height,width;

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

给我 -2-1

我希望解决方案以编程方式获取任何布局的高度和宽度?

12 回答

  • 0

    视图本身,它有自己的生命周期,基本如下:

    • 附上

    • 测量

    • 布局

    • 画画

    因此,根据您何时尝试获得宽度/高度,您可能看不到您期望看到的内容,例如,如果您在onCreate期间执行此操作,则另一方面,视图可能甚至无法在此时间进行测量如果你在按钮的onClick方法中这样做,很可能到目前为止该视图已被附加,测量,布局和绘制,因此,您将看到预期值,您应该实现ViewTreeObserver以确保您获得适当时刻的 Value 观 .

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

    我认为你在OnCreate()方法中获得了高度和宽度,这就是为什么你总是得到0值,因为那时你的视图仍然没有创建 .

    尝试通过单击按钮获得高度和宽度,否则..

  • 1

    作为CapDroid,您正在尝试在视图之前获取大小(如果已绘制),另一种可能的解决方案可能是在视图上执行具有runnable的Post:

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

    如果得到-1或-2,它也可以是LayoutParams.WRAP_CONTENT(-2)或LayoutParams.MATCH_PARENT(-1)的数值 .

  • 9

    只要给你的身高,如果需要,你将获得身高甚至宽度 .

    / ** 在视图渲染之前获取视图高度 @param查看要测量的视图* @return视图的高度* /

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

    试试这个方法:

    int width = mView.getMeasuredWidth();
    
    int height = mView.getMeasuredHeight();
    

    要么

    int width = mTextView.getMeasuredWidth();
    
    int height = mTextView.getMeasuredHeight();
    
  • 0

    第一个片段是正确的,但你需要调用它来执行 after onMeasure() . 否则,尚未测量视图的大小 .

  • 2

    对于框架:

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

    对于屏幕:

    width = getWindowManager().getDefaultDisplay().getWidth();
    height = getWindowManager().getDefaultDisplay().getHeight();
    
  • 13

    最简单的方法是使用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();
    
                    }
                });
            }
    

    如果你需要在方法上使用它,请像这样使用并保存值,你可以使用全局变量 .

  • 100

    我有同样的问题,但不想在测量之前画在屏幕上,所以我在尝试获得高度和宽度之前使用这种测量视图的方法 .

    使用示例:

    layoutView(view);
    int height = 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());
    }
    
  • 1

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

    希望这可以帮助 .

  • 2

    我使用DisplayMetrics来获取屏幕大小,然后我可以将宽度/高度分配给%age中的元素

    它会是这样的

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

    为我工作得很好!!!

相关问题