Accurate way to determine the measured height of a view, even before it changed from GONE to VISIBLE

前端 未结 2 771
有刺的猬
有刺的猬 2021-01-31 11:48

Currently, I have a layout which looks like this. It contains.

  • Title text view, and Price text view, which is visible always.
  • Description Text View
相关标签:
2条回答
  • 2021-01-31 12:05

    Your 2nd code snippet is almost correct, but you need to specify pixel sizes - not FILL_PARENT/MATCH_PARENT. This should work:

    v.measure(MeasureSpec.makeMeasureSpec(parentView.getWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(MAX_HEIGHT, MeasureSpec.AT_MOST));
    final int targetHeight = v.getMeasuredHeight();
    

    You'll need to have a reference to the ViewGroup that v is a child of to get its width, and define MAX_HEIGHT (or perhaps use the parent View's height?).

    Also, you should change the height parameters of the two TextViews that are within the horizontal LinearLayout to wrap_content, as using match_parent here may cause problems. The LinearLayout is set to wrap_content, but the two children don't specify a height.

    0 讨论(0)
  • 2021-01-31 12:21

    I accomplished this for my accordion component. I was facing the exact same issue, of expanding my accordion which required the 'destination' height, that is, the height that it would take after the expansion. This returns the correct height:

    /***
     * This function returns the actual height the layout. The getHeight() function returns the current height which might be zero if
     * the layout's visibility is GONE
     * @param layout
     * @return
     */
    public static int getFullHeight(ViewGroup layout) {
        int specWidth = View.MeasureSpec.makeMeasureSpec(0 /* any */, View.MeasureSpec.UNSPECIFIED);
        int specHeight = View.MeasureSpec.makeMeasureSpec(0 /* any */, View.MeasureSpec.UNSPECIFIED);
    
    
        layout.measure(specWidth,specHeight);
        int totalHeight = 0;//layout.getMeasuredHeight();
        int initialVisibility = layout.getVisibility();
        layout.setVisibility(View.VISIBLE);
        int numberOfChildren = layout.getChildCount();
        for(int i = 0;i<numberOfChildren;i++) {
            View child = layout.getChildAt(i);
            if(child instanceof ViewGroup) {
                totalHeight+=getFullHeight((ViewGroup)child);
            }else {
                int desiredWidth = View.MeasureSpec.makeMeasureSpec(layout.getWidth(),
                        View.MeasureSpec.AT_MOST);
                child.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
                totalHeight+=child.getMeasuredHeight();
            }
    
        }
        layout.setVisibility(initialVisibility);
        return totalHeight;
    }
    

    You can take a look at the accordion component and the animation on GitHub: Android Accordion View

    0 讨论(0)
提交回复
热议问题