These exercises continue the previous project,
Hello,
which already has an
activity_main.xml
file.
This file consists of a
RelativeLayout
containing a
TextView
.
android.widget.RelativeLayout
.
android.widget.RelativeLayout.LayoutParams
.
This is where you look up the attributes you can give to the children of a
RelativeLayout
:
android:layout_centerInParent
,
android:layout_alignParentRight
,
etc.
RelativeLayout
element in the
activity_main.xml
file in
Hello
contains exactly one element,
the
TextView
.
But a
RelativeLayout
(or any other type of
layout)
is necessary only when it contains more than one element.
Keep the
TextView
,
but remove the
RelativeLayout
by removing the pair of
RelativeLayout
tags.
The
activity_main.xml
file should now contain only the following.
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" />Verify that the app still works and that its output remains unchanged. Then put the
RelativeLayout
back in,
changing the
activity_main.xml
file back to
the
way it originally was.
RelativeLayout
can be positioned relative to the edges of the
RelativeLayout
by means of the attributes listed in class
RelativeLayout.LayoutParams
.
I could have prevented the orange
TextView
s
from touching the edge of the yellow
RelativeLayout
by giving a margin to each
TextView
.
But it was simpler to give padding to the
RelativeLayout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:background="#FFFFFF00" tools:context=".MainActivity"> <!-- top row --> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignParentTop\nalignParentLeft"/> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignParentTop\ncenterHorizontal"/> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignParentTop\nalignParentRight"/> <!-- middle row --> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="centerVertical\nalignParentLeft"/> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="centerInParent"/> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="centerVertical\nalignParentRight"/> <!-- bottom row --> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignParentBottom\nalignParentLeft"/> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignParentBottom\ncenterHorizontal"/> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignParentBottom\nalignParentRight"/> </RelativeLayout>
RelativeLayout
can be positioned relative to another child of the
RelativeLayout
.
The other child (in this case, the big red one) must have an
id
number
that has a name.
For example, the following
+id
gives the name
center
to the id number of the big red
TextView
.
(This will create a Java variable whose full name will be
R.id.center
.)
An
id
without the plus does not create a name for an id number.
It merely refers to an existing name.
For example, the second
TextView
("above\nToLeftOf"
)
is
above
the one whose id number is named
center
.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:background="#FFFFFF00" tools:context=".MainActivity"> <TextView android:id="@+id/center" android:layout_width="180dp" android:layout_height="180dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_marginTop="4dp" android:layout_marginBottom="4dp" android:layout_centerInParent="true" android:background="#FFFF0000" android:textSize="10sp" android:gravity="center" android:text="centerInParent"/> <!-- upper left --> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_above="@id/center" android:layout_toLeftOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="above\ntoLeftOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_alignTop="@id/center" android:layout_toLeftOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignTop\ntoLeftOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_above="@id/center" android:layout_alignLeft="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="above\nalignLeft"/> <!-- upper right --> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_above="@id/center" android:layout_toRightOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="above\ntoRightOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_alignTop="@id/center" android:layout_toRightOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignTop\ntoRightOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_above="@id/center" android:layout_alignRight="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="above\nalignRight"/> <!-- lower left --> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_below="@id/center" android:layout_toLeftOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="below\ntoLeftOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_alignBottom="@id/center" android:layout_toLeftOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignBottom\ntoLeftOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_below="@id/center" android:layout_alignLeft="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="below\nalignLeft"/> <!-- lower right --> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_below="@id/center" android:layout_toRightOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="below\ntoRightOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_alignBottom="@id/center" android:layout_toRightOf="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="alignBottom\ntoRightOf"/> <TextView android:layout_width="70dp" android:layout_height="70dp" android:layout_below="@id/center" android:layout_alignRight="@id/center" android:padding="4dp" android:background="#FFFF8000" android:textSize="10sp" android:gravity="center" android:text="below\nalignRight"/> </RelativeLayout>
ApiDemos/src/com/example/android/apis/view/RelativeLayout2.java
ApiDemos/res/layout/relative_layout_2.xml
RelativeLayout
containing four
View
s:
TextView
EditText
has the attribute
android:layout_below="@id/label"
.
Button
has the attributes
android:layout_below="@id/entry"
and
android:layout_alignParentRight="true"
.
Button
has the attributes
android:layout_toLeftOf="@id/ok"
and
android:layout_alignTop="@id/ok"
ApiDemos/res/values/strings.xml
ApiDemos/res/values/colors.xml
blue
(line 21)
android:gravity="center"
puts the text in the center of the state.
Colorado is in the
lower
right
corner of the inner
RelativeLayout
.
This
RelativeLayout
is invisible and is shrink wrapped around the three states.
(I wanted its
layout_width
and
layout_height
to be
wrap_content
,
but for some reason that didn’t shrink wrap.)
The inner
RelativeLayout
is
centered
in the outer
RelativeLayout
,
which fills the screen and is also invisible.
Vertical scale: 5 millimeters = 1 degree of latitude.
Horizontal scale: 5 millimeters = 1⅓ degrees of longitude.
Projection:
equirectangular
with standard parallel at 41° North.
The cosine of 41° is approximately ¾.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout android:layout_width="45mm" android:layout_height="40mm" android:layout_centerInParent="true"> <TextView android:id="@+id/colorado" android:layout_width="26.25mm" android:layout_height="20mm" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:background="#FFB22222" android:gravity="center" android:text="Colorado" /> <TextView android:layout_width="18.75mm" android:layout_height="25mm" android:layout_alignBottom="@id/colorado" android:layout_toLeftOf="@id/colorado" android:background="#FFFF8C00" android:gravity="center" android:text="Utah" /> <TextView android:layout_width="26.25mm" android:layout_height="20mm" android:layout_above="@id/colorado" android:layout_alignRight="@id/colorado" android:layout_marginRight="7.5mm" android:background="#FFFFD700" android:gravity="center" android:text="Wyoming" /> </RelativeLayout> </RelativeLayout>
What would happen to Wyoming if you drew Utah before Wyoming?
Give the inner
RelativeLayout
a black border
so we can see it.
Follow the directions in exercise 8 of
Hello,
but remove the
<solid>
element
from your file
border.xml
.
(To see the whole border,
make the states semitransparent or give the
RelativeLayout
padding.)
TextView
.
android:clickable="true" android:onClick="visitColorado"In the file
app/java/edu.nyu.scps.hello/MainActivity.java
,
add one of the following methods to class
MainActivity
.
Insert one of them immediately before the second line that says
@Override
.
See
Toast
Messages
and
Dialog Boxes.
public void visitColorado(View v) { Toast toast = Toast.makeText(this, "Thank you for touching Colorado.", Toast.LENGTH_LONG); toast.show(); }
public void visitColorado(View v) { //The builder will build the dialog. AlertDialog.Builder builder = new AlertDialog.Builder(this); //Tell the builder about the dialog we want it to create. builder.setTitle("Colorado"); builder.setMessage("Thank you for visiting Colorado."); //null because we want the positive button to do nothing //except dismisss the dialog. builder.setPositiveButton("OK", null); //Now that we've finished describing the dialog, //tell the builder to create it. AlertDialog alertDialog = builder.create(); alertDialog.show(); }
You’ll have to insert the following statement with all the other
import
statements at the top of
app/java/edu.nyu.scps.hello/MainActivity.java
.
import android.app.AlertDialog;