Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Using FEATURE_NO_TITLE with custom ViewGroup leaves space on top of the window

I am trying to create a custom ViewGroup, and I want to use it with a full screen application. I am using the "requestWindowFeature(Window.FEATURE_NO_TITLE)" to hide the title bar. The title bar is not showing, but it still consuming space on top of the window.

Here is a picture of the problem

The image above was generated with the following code:

public class CustomLayoutTestActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Button b = new Button(this);
        b.setText("Hello");
        CustomLayout layout = new CustomLayout(this);
        layout.addView(b);
        setContentView(layout);
    }
}

public class CustomLayout extends ViewGroup {
    public CustomLayout(Context context) {
        super(context);
    }
    public CustomLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        Log.i("CustomLayout", "changed="+changed+" l="+l+" t="+t+" r="+r+" b="+b);
        final int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            final View v = getChildAt(i);
            v.layout(l, t, r, b);
        }
    }
}

(The full Eclipse project is here)

It is interesting to see that it is the Android that is given this space for my custom layout. I am setting the CustomLayout as the root layout of my Activity. In the Log in the "onLayout" is receiving "t=25", and that is what is pushing my layout down. What I don't know is what I am doing wrong that makes Android the "t=25" (which is exactly the height of the title bar).

I am running this code in the Android SDK 2.1, but I also happens in Android 2.2.


EDIT: If I change the CustomLayout class for some default layout (such as LinearLayout), the space disappears. Of course, the default layouts of Android SDK don't create the layout I am trying to create, so that is why I am creating one.

Although the layout I am creating is somewhat complex, this is the smallest code I could create reproducing the problem I have with my layout.

like image 314
lgfischer Avatar asked Dec 06 '11 01:12

lgfischer


1 Answers

It's not a full answer, but in the meantime you can work around the problem by wrapping your custom layout in a <FrameLayout />

Also, it's worth noting that your layout extends beyond the bottom of the screen. It's shifted down by the title bar height (38 pixels in my emulator)

Edit: Got it. onLayout() (and the corresponding layout() method) specify that the coordinate are not relative to the screen origin, they're relative to the parent ( http://developer.android.com/reference/android/view/View.html#layout%28int,%20int,%20int,%20int%29 ). So the system is telling you that you're at relative coordinates (0, 38), and you're adding it when passing that down to your child, which means that you're saying that your child is at screen coordinates (0, 76), causing the gap.

What you actually want to do is:

v.layout(0, 0, r - l, b - t);

That will put your child Views aligned with the top left corner of your View, with the same width and height as your view.

like image 137
Hounshell Avatar answered Sep 23 '22 22:09

Hounshell