svprdga
svprdga

Reputation: 2569

Obtain width and height of a Layout

I have a FrameLayout, when I try to get its params like this:

ViewGroup.LayoutParams params = cameraPreviewFrameLayout.getLayoutParams();
int layoutHeight = params.height;
int layoutWidth = params.width;

Here, layoutHeight is -2 and layoutWidth is -1. This is my XML:

<FrameLayout
    android:id="@+id/liveActivity_cameraPreviewFrameLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>

I am performing this action from onCreate, but also I tried to to it through onStart(), with the same result. Obviously the height and width of this layout is not these values.

How can I retrieve the size of the layout effectively?

Upvotes: 0

Views: 89

Answers (2)

mes
mes

Reputation: 3621

Proper way to getting size of layout after or inside onLayoutChange method call

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final FrameLayout layout = (FrameLayout) findViewById(R.id.liveActivity_cameraPreviewFrameLayout);
    layout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            int width = right - left;
            int height = bottom - top;
            Log.v("TAG", String.format("%d - %d", width, height));
            //Or
            Log.v("TAG", String.format("%d - %d", layout.getWidth(), layout.getHeight()));
            //And after this method call, calling layout.getWidth() and layout.getHeight() will give right values
        }
    });
}

Upvotes: 1

Simas
Simas

Reputation: 44188

The values returned are correct, because:

-2 stands for LayoutParams.WRAP_CONENT
-1 stands for LayoutParams.MATCH_PARENT

If you want to get exact values, you'll need to use the methods getHeight and getWidth. However those methods can only be used once the layout has been measured, so delay your call like this:

cameraPreviewFrameLayout.post(new Runnable() {
    @Override
    public void run() {
        View v = cameraPreviewFrameLayout;
        Log.e("TAG", v.getWidth() + ":" + v.getHeight());
    }
});

Upvotes: 1

Related Questions