* commit 'a004c2ec06a5ba3d65786e50171d8cdbb80515c8': revise helpouts tags to use just one on each page
420 lines
18 KiB
Plaintext
420 lines
18 KiB
Plaintext
page.title=Building a Simple User Interface
|
||
trainingnavtop=true
|
||
|
||
page.tags=ui
|
||
helpoutsWidget=true
|
||
|
||
@jd:body
|
||
|
||
|
||
<!-- This is the training bar -->
|
||
<div id="tb-wrapper">
|
||
<div id="tb">
|
||
|
||
<h2>This lesson teaches you to</h2>
|
||
|
||
<ol>
|
||
<li><a href="#LinearLayout">Create a Linear Layout</a></li>
|
||
<li><a href="#TextInput">Add a Text Field</a></li>
|
||
<li><a href="#Strings">Add String Resources</a></li>
|
||
<li><a href="#Button">Add a Button</a></li>
|
||
<li><a href="#Weight">Make the Input Box Fill in the Screen Width</a></li>
|
||
</ol>
|
||
|
||
|
||
<h2>You should also read</h2>
|
||
<ul>
|
||
<li><a href="{@docRoot}guide/topics/ui/declaring-layout.html">Layouts</a></li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<p>In this lesson, you create a layout in XML that includes a text field and a
|
||
button. In the next lesson, your app responds when the button is pressed by sending the
|
||
content of the text field to another activity.</p>
|
||
|
||
<p>The graphical user interface for an Android app is built using a hierarchy of {@link
|
||
android.view.View} and {@link android.view.ViewGroup} objects. {@link android.view.View} objects are
|
||
usually UI widgets such as <a href="{@docRoot}guide/topics/ui/controls/button.html">buttons</a> or
|
||
<a href="{@docRoot}guide/topics/ui/controls/text.html">text fields</a>.
|
||
{@link android.view.ViewGroup} objects are
|
||
invisible view containers that define how the child views are laid out, such as in a
|
||
grid or a vertical list.</p>
|
||
|
||
<p>Android provides an XML vocabulary that corresponds to the subclasses of {@link
|
||
android.view.View} and {@link android.view.ViewGroup} so you can define your UI in XML using
|
||
a hierarchy of UI elements.</p>
|
||
|
||
<p>Layouts are subclasses of the {@link android.view.ViewGroup}. In this exercise, you'll work with
|
||
a {@link android.widget.LinearLayout}.</p>
|
||
|
||
<div class="sidebox-wrapper">
|
||
<div class="sidebox">
|
||
<h2>Alternative Layouts</h2>
|
||
<p>Declaring your UI layout in XML rather than runtime code is useful for several reasons,
|
||
but it's especially important so you can create different layouts for
|
||
different screen sizes. For example, you can create two versions of a layout and tell
|
||
the system to use one on "small" screens and the other on "large" screens. For more information,
|
||
see the class about <a
|
||
href="{@docRoot}training/basics/supporting-devices/index.html">Supporting Different
|
||
Devices</a>.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<img src="{@docRoot}images/viewgroup.png" alt="" width="400" height="214" />
|
||
<p class="img-caption"><strong>Figure 1.</strong> Illustration of how {@link
|
||
android.view.ViewGroup} objects form branches in the layout and contain other {@link
|
||
android.view.View} objects.</p>
|
||
|
||
|
||
<h2 id="LinearLayout">Create a Linear Layout</h2>
|
||
|
||
<ol>
|
||
<li>In Android Studio, from the <code>res/layout</code> directory, open the <code>activity_my.xml</code>
|
||
file.
|
||
<p>The BlankActivity template you chose when you created this project includes the
|
||
<code>activity_my.xml</code> file with a {@link android.widget.RelativeLayout} root view and a
|
||
{@link android.widget.TextView} child view.</p>
|
||
</li>
|
||
<li>In the <strong>Preview</strong> pane, click the Hide icon <img src="{@docRoot}images/tools/as-hide-side.png"
|
||
style="vertical-align:baseline;margin:0; max-height:1.5em" /> to close the Preview pane.
|
||
<p> In Android Studio, when you open a layout file, you’re first shown
|
||
the Preview pane. Clicking elements in this pane opens the WYSIWYG tools in the Design pane. For
|
||
this lesson, you’re going to work directly with the XML.</p></li>
|
||
<li>Delete the {@link android.widget.TextView <TextView>} element.</li>
|
||
<li>Change the {@link android.widget.RelativeLayout <RelativeLayout>} element to
|
||
{@link android.widget.LinearLayout <LinearLayout>}.</li>
|
||
<li>Add the <a href="{@docRoot}reference/android/widget/LinearLayout.html#attr_android:orientation">
|
||
{@code android:orientation}</a> attribute and set it to <code>"horizontal"</code>.</li>
|
||
<li>Remove the {@code android:padding} attributes and the {@code tools:context} attribute.
|
||
</ol>
|
||
|
||
</p>The result looks like this:</p>
|
||
|
||
<p class="code-caption">res/layout/activity_my.xml</p>
|
||
<pre>
|
||
<LinearLayout 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:orientation="horizontal" >
|
||
</LinearLayout>
|
||
</pre>
|
||
|
||
<p>{@link android.widget.LinearLayout} is a view group (a subclass of {@link
|
||
android.view.ViewGroup}) that lays out child views in either a vertical or horizontal orientation,
|
||
as specified by the <a
|
||
href="{@docRoot}reference/android/widget/LinearLayout.html#attr_android:orientation">{@code
|
||
android:orientation}</a> attribute. Each child of a {@link android.widget.LinearLayout} appears on
|
||
the screen in the order in which it appears in the XML.</p>
|
||
|
||
<p>Two other attributes, <a
|
||
href="{@docRoot}reference/android/view/View.html#attr_android:layout_width">{@code
|
||
android:layout_width}</a> and <a
|
||
href="{@docRoot}reference/android/view/View.html#attr_android:layout_height">{@code
|
||
android:layout_height}</a>, are required for all views in order to specify their size.</p>
|
||
|
||
<p>Because the {@link android.widget.LinearLayout} is the root view in the layout, it should fill
|
||
the entire screen area that's
|
||
available to the app by setting the width and height to
|
||
<code>"match_parent"</code>. This value declares that the view should expand its width
|
||
or height to <em>match</em> the width or height of the parent view.</p>
|
||
|
||
<p>For more information about layout properties, see the <a
|
||
href="{@docRoot}guide/topics/ui/declaring-layout.html">Layout</a> guide.</p>
|
||
|
||
|
||
<h2 id="TextInput">Add a Text Field</h2>
|
||
|
||
<p>As with every {@link android.view.View} object, you must define certain XML attributes to specify
|
||
the {@link android.widget.EditText} object's properties.</p>
|
||
|
||
<ol>
|
||
<li>In the <code>activity_my.xml</code> file, within the
|
||
{@link android.widget.LinearLayout <LinearLayout>} element, define an
|
||
{@link android.widget.EditText <EditText>} element with the <code>id</code> attribute
|
||
set to <code>@+id/edit_message</code>.</li>
|
||
<li>Define the <code>layout_width</code> and <code>layout_height</code> attributes as
|
||
<code>wrap_content</code>.</li>
|
||
<li>Define a <code>hint</code> attribute as a string object named <code>edit_message</code>.</li>
|
||
</ol>
|
||
|
||
<p>The {@link android.widget.EditText <EditText>} element should read as follows:</p>
|
||
|
||
<p class="code-caption">res/layout/activity_my.xml</p>
|
||
<pre>
|
||
<EditText android:id="@+id/edit_message"
|
||
android:layout_width="wrap_content"
|
||
android:layout_height="wrap_content"
|
||
android:hint="@string/edit_message" />
|
||
</pre>
|
||
|
||
<p>Here are the {@link android.widget.EditText <EditText>} attributes you added:</p>
|
||
|
||
<dl>
|
||
<dt><a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code android:id}</a></dt>
|
||
<dd>This provides a unique identifier for the view, which you can use to reference the object
|
||
from your app code, such as to read and manipulate the object (you'll see this in the next
|
||
lesson).
|
||
|
||
<p>The at sign (<code>@</code>) is required when you're referring to any resource object from
|
||
XML. It is followed by the resource type ({@code id} in this case), a slash, then the resource name
|
||
({@code edit_message}).</p>
|
||
|
||
<div class="sidebox-wrapper">
|
||
<div class="sidebox">
|
||
<h3>Resource Objects</h3>
|
||
<p>A resource object is a unique integer name that's associated with an app resource,
|
||
such as a bitmap, layout file, or string.</p>
|
||
<p>Every resource has a
|
||
corresponding resource object defined in your project's {@code gen/R.java} file. You can use the
|
||
object names in the {@code R} class to refer to your resources, such as when you need to specify a
|
||
string value for the <a
|
||
href="{@docRoot}reference/android/widget/TextView.html#attr_android:hint">{@code android:hint}</a>
|
||
attribute. You can also create arbitrary resource IDs that you associate with a view using the <a
|
||
href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code android:id}</a> attribute,
|
||
which allows you to reference that view from other code.</p>
|
||
<p>The SDK tools generate the {@code R.java} file each time you compile your app. You should never
|
||
modify this file by hand.</p>
|
||
<p>For more information, read the guide to <a
|
||
href="{@docRoot}guide/topics/resources/providing-resources.html">Providing Resources</a>.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<p>The plus sign (<code>+</code>) before the resource type is needed only when you're defining a
|
||
resource ID for the first time. When you compile the app,
|
||
the SDK tools use the ID name to create a new resource ID in
|
||
your project's {@code gen/R.java} file that refers to the {@link
|
||
android.widget.EditText} element. With the resource ID declared once this way,
|
||
other references to the ID do not
|
||
need the plus sign. Using the plus sign is necessary only when specifying a new resource ID and not
|
||
needed for concrete resources such as strings or layouts. See the sidebox for
|
||
more information about resource objects.</p></dd>
|
||
|
||
<dt><a
|
||
href="{@docRoot}reference/android/view/View.html#attr_android:layout_width">{@code
|
||
android:layout_width}</a> and <a
|
||
href="{@docRoot}reference/android/view/View.html#attr_android:layout_height">{@code
|
||
android:layout_height}</a></dt>
|
||
<dd>Instead of using specific sizes for the width and height, the <code>"wrap_content"</code> value
|
||
specifies that the view should be only as big as needed to fit the contents of the view. If you
|
||
were to instead use <code>"match_parent"</code>, then the {@link android.widget.EditText}
|
||
element would fill the screen, because it would match the size of the parent {@link
|
||
android.widget.LinearLayout}. For more information, see the <a
|
||
href="{@docRoot}guide/topics/ui/declaring-layout.html">Layouts</a> guide.</dd>
|
||
|
||
<dt><a
|
||
href="{@docRoot}reference/android/widget/TextView.html#attr_android:hint">{@code
|
||
android:hint}</a></dt>
|
||
<dd>This is a default string to display when the text field is empty. Instead of using a hard-coded
|
||
string as the value, the {@code "@string/edit_message"} value refers to a string resource defined in
|
||
a separate file. Because this refers to a concrete resource (not just an identifier), it does not
|
||
need the plus sign. However, because you haven't defined the string resource yet, you’ll see a
|
||
compiler error at first. You'll fix this in the next section by defining the string.
|
||
<p class="note"><strong>Note:</strong> This string resource has the same name as the element ID:
|
||
{@code edit_message}. However, references
|
||
to resources are always scoped by the resource type (such as {@code id} or {@code string}), so using
|
||
the same name does not cause collisions.</p>
|
||
</dd>
|
||
</dl>
|
||
|
||
<h2 id="Strings">Add String Resources</h2>
|
||
|
||
<p>By default, your Android project includes a string resource file at
|
||
<code>res/values/strings.xml</code>. Here, you'll add a new string named
|
||
<code>"edit_message"</code> and set the value to "Enter a message."</p>
|
||
|
||
<ol>
|
||
<li>In Android Studio, from the <code>res/values</code> directory, open <code>strings.xml</code>.</li>
|
||
<li>Add a line for a string named <code>"edit_message"</code> with the value, "Enter a message".
|
||
</li>
|
||
<li>Add a line for a string named <code>"button_send"</code> with the value, "Send".
|
||
<p>You'll create the button that uses this string in the next section.</p>
|
||
</li>
|
||
<li>Remove the line for the <code>"hello world"</code> string.</li>
|
||
</ol>
|
||
|
||
<p>The result for <code>strings.xml</code> looks like this:</p>
|
||
|
||
<p class="code-caption">res/values/strings.xml</p>
|
||
<pre>
|
||
<?xml version="1.0" encoding="utf-8"?>
|
||
<resources>
|
||
<string name="app_name">My First App</string>
|
||
<string name="edit_message">Enter a message</string>
|
||
<string name="button_send">Send</string>
|
||
<string name="action_settings">Settings</string>
|
||
<string name="title_activity_main">MainActivity</string>
|
||
</resources>
|
||
</pre>
|
||
|
||
<p>For text in the user interface, always specify each string as
|
||
a resource. String resources allow you to manage all UI text in a single location,
|
||
which makes the text easier to find and update. Externalizing the strings also allows you to
|
||
localize your app to different languages by providing alternative definitions for each
|
||
string resource.</p>
|
||
|
||
<p>For more information about using string resources to localize your app for other languages,
|
||
see the <a
|
||
href="{@docRoot}training/basics/supporting-devices/index.html">Supporting Different Devices</a>
|
||
class.</p>
|
||
|
||
|
||
<h2 id="Button">Add a Button</h2>
|
||
|
||
<ol>
|
||
<li>In Android Studio, from the <code>res/layout</code> directory, edit the <code>activity_my.xml</code>
|
||
file.</li>
|
||
<li>Within the
|
||
{@link android.widget.LinearLayout <LinearLayout>} element, define a
|
||
{@link android.widget.Button <Button>} element immediately following the
|
||
{@link android.widget.EditText <EditText>} element.</li>
|
||
<li>Set the button's width and height attributes to <code>"wrap_content"</code> so
|
||
the button is only as big as necessary to fit the button's text label.</li>
|
||
<li>Define the button's text label with the <a
|
||
href="{@docRoot}reference/android/widget/TextView.html#attr_android:text">{@code
|
||
android:text}</a> attribute; set its value to the <code>button_send</code> string
|
||
resource you defined in the previous section.</li>
|
||
</ol>
|
||
|
||
<p>Your {@link android.widget.LinearLayout <LinearLayout>} should look like this:</p>
|
||
|
||
<p class="code-caption">res/layout/activity_my.xml</p>
|
||
<pre>
|
||
<LinearLayout 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:orientation="horizontal" >
|
||
<EditText android:id="@+id/edit_message"
|
||
android:layout_width="wrap_content"
|
||
android:layout_height="wrap_content"
|
||
android:hint="@string/edit_message" />
|
||
<Button
|
||
android:layout_width="wrap_content"
|
||
android:layout_height="wrap_content"
|
||
android:text="@string/button_send" />
|
||
</LinearLayout>
|
||
</pre>
|
||
|
||
<p class="note"><strong>Note:</strong> This button doesn't need the
|
||
<a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code android:id}</a>
|
||
attribute, because it won't be referenced from the activity code.</p>
|
||
|
||
<p>The layout is currently designed so that both the {@link android.widget.EditText} and {@link
|
||
android.widget.Button} widgets are only as big as necessary to fit their content, as shown in
|
||
figure 2.</p>
|
||
|
||
<img src="{@docRoot}images/training/firstapp/edittext_wrap.png" />
|
||
<p class="img-caption"><strong>Figure 2.</strong> The {@link android.widget.EditText} and {@link
|
||
android.widget.Button} widgets have their widths set to
|
||
<code>"wrap_content"</code>.</p>
|
||
|
||
<p>This works fine for the button, but not as well for the text field, because the user might type
|
||
something longer. It would be nice to fill the unused screen width
|
||
with the text field. You can do this inside a
|
||
{@link android.widget.LinearLayout} with the <em>weight</em> property, which
|
||
you can specify using the <a
|
||
href="{@docRoot}reference/android/widget/LinearLayout.LayoutParams.html#weight">{@code
|
||
android:layout_weight}</a> attribute.</p>
|
||
|
||
<p>The weight value is a number that specifies the amount of remaining space each view should
|
||
consume,
|
||
relative to the amount consumed by sibling views. This works kind of like the
|
||
amount of ingredients in a drink recipe: "2
|
||
parts soda, 1 part syrup" means two-thirds of the drink is soda. For example, if you give
|
||
one view a weight of 2 and another one a weight of 1, the sum is 3, so the first view fills 2/3 of
|
||
the remaining space and the second view fills the rest. If you add a third view and give it a weight
|
||
of 1, then the first view (with weight of 2) now gets 1/2 the remaining space, while the remaining
|
||
two each get 1/4.</p>
|
||
|
||
<p>The default weight for all views is 0, so if you specify any weight value
|
||
greater than 0 to only one view, then that view fills whatever space remains after all views are
|
||
given the space they require.</p>
|
||
|
||
<h2 id="Weight">Make the Input Box Fill in the Screen Width</h2>
|
||
|
||
<p>To fill the remaining space in your layout with the {@link android.widget.EditText} element, do
|
||
the following:</p>
|
||
|
||
<ol>
|
||
<li>In the <code>activity_my.xml</code> file, assign the
|
||
{@link android.widget.EditText <EditText>} element's <code>layout_weight</code> attribute a value
|
||
of <code>1</code>.</li>
|
||
<li>Also, assign {@link android.widget.EditText <EditText>} element's <code>layout_width</code>
|
||
attribute a value of <code>0dp</code>.
|
||
|
||
<p class="code-caption">res/layout/activity_my.xml</p>
|
||
<pre>
|
||
<EditText
|
||
android:layout_weight="1"
|
||
android:layout_width="0dp"
|
||
... />
|
||
</pre>
|
||
|
||
<p>To improve the layout efficiency when you specify the weight, you should change the
|
||
width of the {@link android.widget.EditText} to be
|
||
zero (0dp). Setting the width to zero improves layout performance because using
|
||
<code>"wrap_content"</code> as the width requires the system to calculate a width that is
|
||
ultimately irrelevant because the weight value requires another width calculation to fill the
|
||
remaining space.</p>
|
||
|
||
<p>Figure 3
|
||
shows the result when you assign all weight to the {@link android.widget.EditText} element.</p>
|
||
|
||
<img src="{@docRoot}images/training/firstapp/edittext_gravity.png" />
|
||
<p class="img-caption"><strong>Figure 3.</strong> The {@link android.widget.EditText} widget is
|
||
given all the layout weight, so it fills the remaining space in the {@link
|
||
android.widget.LinearLayout}.</p>
|
||
|
||
</li>
|
||
</ol>
|
||
|
||
<p>Here’s how your complete <code>activity_my.xml</code>layout file should now look:</p>
|
||
|
||
<p class="code-caption">res/layout/activity_my.xml</p>
|
||
<pre>
|
||
<?xml version="1.0" encoding="utf-8"?>
|
||
<LinearLayout 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:orientation="horizontal">
|
||
<EditText android:id="@+id/edit_message"
|
||
android:layout_weight="1"
|
||
android:layout_width="0dp"
|
||
android:layout_height="wrap_content"
|
||
android:hint="@string/edit_message" />
|
||
<Button
|
||
android:layout_width="wrap_content"
|
||
android:layout_height="wrap_content"
|
||
android:text="@string/button_send" />
|
||
</LinearLayout>
|
||
</pre>
|
||
|
||
<h2>Run Your App</h2>
|
||
|
||
<p>This layout is applied by the default {@link android.app.Activity} class
|
||
that the SDK tools generated when you created the project. Run the app to see the
|
||
results:</p>
|
||
|
||
<ul>
|
||
<li>In Android Studio, from the toolbar, click <strong>Run</strong>
|
||
<img src="{@docRoot}images/tools/as-run.png"
|
||
style="vertical-align:baseline;margin:0; max-height:1em" />.</li>
|
||
<li>Or from a command line, change directories to the root of your Android project and
|
||
execute:
|
||
<pre>
|
||
ant debug
|
||
adb install bin/MyFirstApp-debug.apk
|
||
</pre></li>
|
||
</ul>
|
||
|
||
<p>Continue to the <a href="starting-activity.html">next
|
||
lesson</a> to learn how to respond to button presses, read content
|
||
from the text field, start another activity, and more.</p>
|
||
|
||
|
||
|