Android FrameLayout and TextView - why does LayoutParams work where setGravity() does not?

MartyMacGyver picture MartyMacGyver · Sep 24, 2011 · Viewed 10k times · Source

I'm using a FrameLayout to display (on demand) some text on the screen. I want the text to be in a certain place, so I thought setGravity() would do the job... but no, it seems to have no effect whatsoever on where the text goes (and other objects like ImageView don't even have this method).

So first, what exactly is TextView.setGravity() used for? (Edit: I understand this much better now, thanks! Still not clear on the following part of the question though.)

Second, it seems the only way to update a FrameLayout in this way is to create a new FrameLayout.LayoutParams object with the settings you want, and then use the setLayoutParams() method to apply it. (This seems to automatically update the view so is a requestLayout() call necessary?) And is there a simpler / more straightforward way to achieve this for a FrameLayout... say, without creating a new LayoutParams object as I'm doing now?

Thanks! For reference, below is a (working) code snippet showing how I'm setting up this FrameLayout and TextView.

    FrameLayout fl1 = new FrameLayout(this);
    FrameLayout.LayoutParams flp1 = new FrameLayout.LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    fl1.setId(9001);
    fl1.setLayoutParams(flp1);
      .....
    tv1 = new TextView(this);
    FrameLayout.LayoutParams tvp1 = new FrameLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
        (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
    tv1.setId(9006);
    tv1.setLayoutParams(tvp1); // This works
    tv1.setBackgroundColor(Color.GRAY);
    tv1.setTextColor(Color.BLACK);
    tv1.setText("Dynamic layouts ftw!");
    tv1.setGravity(Gravity.CENTER); // This does NOT work
     .....
    fl1.addView(tv1);

Answer

Adil Soomro picture Adil Soomro · Sep 24, 2011

tv1.setGravity(Gravity.CENTER);

belongs to the gravity of the TEXT inside the TextView.

As documentation states:

Sets the horizontal alignment of the text and the vertical gravity that will be used when there is extra space in the TextView beyond what is required for the text itself.