Android Development Essentials: Part 1 - XML Layouts
Building native apps for Android using Android Studio involves the use of two languages: XML and Java. XML is used to create a design of the layout and Java is used to define the functionality.
Below are some of the layouts that are frequently used in XML:
LinearLayout
In LinearLayout, all the elements are arranged in a single column or a single row based on the orientation. LinearLayout supports elements in horizontal and vertical orientation. Alignment needn’t be specified for each element.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView"/> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView2"/> </LinearLayout>
RelativeLayout
In RelativeLayout, all the elements in the layout are arranged relative to another.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress" android:ems="10" android:id="@+id/email" android:layout_marginBottom="50dp" android:layout_above="@+id/password" android:layout_centerHorizontal="true"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:ems="10" android:layout_centerVertical="true" android:id="@+id/password"/> <Button android:text="Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/password" android:layout_centerHorizontal="true" android:layout_marginTop="34dp" android:id="@+id/submit_button"/> </RelativeLayout>
ScrollView
ScrollView is a used to allow scroll in a layout so that you can include more information than what can be displayed on the screen. A ScrollView is a FrameLayout
, meaning you should place one child in it containing the entire contents to scroll. So when using ScrollView, use RelativeLayout , LinearLayout or one of the other layouts to enclose all the other elements.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="@string/large_text"/> </LinearLayout> </ScrollView>
CoordinatorLayout
CoordinatorLayout
, a layout which provides an additional level of control over touch events between child views, something which many of the components in the Design library take advantage of.
An example of this is when you add a FloatingActionButton
as a child of your CoordinatorLayout
and then pass that CoordinatorLayout
to your Snackbar.make()
call.
Instead of the snackbar displaying over the floating action button, the FloatingActionButton
takes advantage of additional callbacks provided by CoordinatorLayout
to automatically move upward as the snackbar animates in and returns to its position when the snackbar animates out.
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.coffee.skstudentmapper.NavigationActivity"> <!-- include appbar/toolbar here --> <!-- include main content here --> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" app:srcCompat="@android:drawable/ic_dialog_email"/> </android.support.design.widget.CoordinatorLayout>
DrawerLayout & NavigationView
The Navigation Drawer is a common component in Android apps. To create a Navigation Drawer, a NavigationView
is placed within a DrawerLayout
. Two important attributes to note are app:headerLayout
which controls the (optional) layout used for the header and app:menu
which is the menu resource inflated for the navigation items (this can also be updated at runtime).
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <!-- Include main content layout --> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_navigation" app:menu="@menu/activity_navigation_drawer"/> </android.support.v4.widget.DrawerLayout>
AppBarLayout
AppBarLayout is a vertical LinearLayout
which implements many of the features of material designs app bar concept, namely scrolling gestures. It is mainly used to display toolbar and implement collapsing toolbar and related effects.
<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"/> </android.support.design.widget.AppBarLayout>
TabLayout
Using Tabs to switch between different views is not a new concept on Android. The Design library’s TabLayout
simplifies the process of adding tabs to your app. It implements both fixed tabs, where the view’s width is divided equally between all of the tabs, as well as scrollable tabs, where the tabs are not a uniform size and can scroll horizontally.
<android.support.design.widget.TabLayout android:id="@+id/tablayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" app:tabGravity="fill" android:theme="@style/ThemeOverlay.AppCompat.Dark" /> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/>
In the above, we add a TabLayout
as well as a ViewPager
. The ViewPager
will be used to enable horizontal paging between tabs.