I am trying to define a layout where an ImageView
is aligned at the bottom of the screen and also under a GridView
, to avoid overlapping.
This however results in the ImageView
being set just under the GridView
but not aligned with the bottom of the screen.
Can this be solved using a different kind of Layout?
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@drawable/background"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/gs_top_text_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:paddingBottom="30dp">
<RelativeLayout
android:id="@+id/gs_top_sub_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:paddingBottom="30dp">
<TextView
android:id="@+id/text_l"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"/>
<TextView
android:id="@+id/text_t"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/gs_top_sub_container"
android:layout_centerHorizontal="true">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/text1"/>
</RelativeLayout>
</RelativeLayout>
<GridView
android:id="@+id/gs_grid_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/gs_top_text_container"
android:descendantFocusability="blocksDescendants"
android:horizontalSpacing="2dp"
android:verticalSpacing="2dp"
android:numColumns="3"
android:gravity="center"
android:paddingBottom="10dp"
android:paddingTop="10dp" />
<ImageView
android:id="@+id/gs_bottom_logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/gs_grid_view"
android:layout_alignParentBottom="true"
android:adjustViewBounds="true"
android:maxWidth="200dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"/>
</RelativeLayout>
You can set the layout_height="0dp" of your header, footer and ScrollView and define a layout_weight . Just play around with the values until you find out which works best. The resulting heights of header and footer would dynamically change with the screensize.
RelativeLayout is a view group that displays child views in relative positions. The position of each view can be specified as relative to sibling elements (such as to the left-of or below another view) or in positions relative to the parent RelativeLayout area (such as aligned to the bottom, left or center).
Use RelativeLayout instead of LinearLayout . There are also many other layouts you can try. Check here for the other type of available layouts. RelativeLayout lets child views specify their position relative to the parent view or to each other (specified by ID).
This is how I would do that:
1 - Put the ImageView on the Bottom
2 - Put the GridView ABOVE it.
<!-- First anchor this View to the bottom --> <ImageView android:id="@+id/gs_bottom_logo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:adjustViewBounds="true" android:maxWidth="200dp" android:paddingLeft="20dp" android:paddingRight="20dp" /> <!-- Then put this View ABOVE the ImageView --> <GridView android:id="@+id/gs_grid_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/gs_top_text_container" android:layout_above="@id/gs_bottom_logo" android:descendantFocusability="blocksDescendants" android:horizontalSpacing="2dp" android:verticalSpacing="2dp" android:numColumns="3" android:gravity="center" android:paddingBottom="10dp" android:paddingTop="10dp" />
This way I used the relativity of elements in a RelativeLayout
[EDIT]
Just for fun... I optimized your WHOLE LAYOUT.
Please note how the same design is achieved by using many layouts less.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="@drawable/background" > <TextView android:id="@+id/text_l" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:paddingBottom="30dp" /> <TextView android:id="@+id/text_t" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:paddingBottom="30dp" /> <!-- This container is (unfortunately) still needed, to make these two textViews horizontally centered... :( --> <RelativeLayout android:id="@+id/rlCentering" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/text_l" android:layout_centerHorizontal="true" android:paddingBottom="30dp" > <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/text1" /> </RelativeLayout> <!-- First, anchor this View to the bottom --> <ImageView android:id="@+id/gs_bottom_logo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:adjustViewBounds="true" android:maxWidth="200dp" android:paddingLeft="20dp" android:paddingRight="20dp" /> <!-- Then put this View ABOVE the ImageView --> <GridView android:id="@+id/gs_grid_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/rlCentering" android:layout_above="@id/gs_bottom_logo" android:descendantFocusability="blocksDescendants" android:horizontalSpacing="2dp" android:verticalSpacing="2dp" android:numColumns="3" android:gravity="center" android:paddingBottom="10dp" android:paddingTop="10dp" /> </RelativeLayout>
And this is what I got in the Graphical Editor (I put some images I had and some texts to identify the TextViews):
Solved it by putting the ImageView in a RelativeLayout, setting the layout_below
item in the RelativeLayout and the alignParentBottom
item of ImageView:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/gs_grid_view">
<ImageView
android:id="@+id/gs_bottom_logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:adjustViewBounds="true"
android:maxWidth="200dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"/>
</RelativeLayout>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With