Had an uncommited change I forgot to upload when I merged the new Snackbar class--d'oh! Since this is a small fix, I'll verify it, +2 it myself, and merge. See first comment for doc stage location. bug: 25191776 Change-Id: I1593f81d09a2607a559f0341ff827c79c6e00a70
205 lines
7.2 KiB
Plaintext
205 lines
7.2 KiB
Plaintext
page.title=Building and Displaying a Pop-Up Message
|
|
page.tags="Snackbar" "popup" "pop-up"
|
|
helpoutsWidget=true
|
|
trainingnavtop=true
|
|
|
|
@jd:body
|
|
|
|
<div id="tb-wrapper">
|
|
<div id="tb">
|
|
|
|
<h2>This lesson teaches you to</h2>
|
|
|
|
<ol>
|
|
<li><a href="#coordinator">Use a CoordinatorLayout</a></li>
|
|
<li><a href="#display">Display a Message</a></li>
|
|
</ol>
|
|
|
|
<h2>You should also read</h2>
|
|
<ul>
|
|
<li><a href="{@docRoot}tools/support-library/setup.html"
|
|
>Support Library Setup</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<p>
|
|
You can use a {@link android.support.design.widget.Snackbar} to display a brief
|
|
message to the user. The message automatically goes away after a short
|
|
period. A {@link android.support.design.widget.Snackbar} is ideal
|
|
for brief messages that the user doesn't necessarily need to act on. For
|
|
example, an email app could use a {@link
|
|
android.support.design.widget.Snackbar} to tell the user that the app
|
|
successfully sent an email.
|
|
</p>
|
|
|
|
<h2 id="coordinator">Use a CoordinatorLayout</h2>
|
|
|
|
<p>
|
|
A {@link android.support.design.widget.Snackbar} is attached to a view. The
|
|
{@link android.support.design.widget.Snackbar} provides basic functionality
|
|
if it is attached to any object derived from the {@link android.view.View}
|
|
class, such as any of the common layout objects. However, if the
|
|
{@link android.support.design.widget.Snackbar}
|
|
is attached to a {@link android.support.design.widget.CoordinatorLayout}, the
|
|
{@link android.support.design.widget.Snackbar} gains additional features:
|
|
</p>
|
|
|
|
<ul>
|
|
<li>The user can dismiss the {@link android.support.design.widget.Snackbar}
|
|
by swiping it away.
|
|
</li>
|
|
|
|
<li>The layout moves some other UI elements when the {@link
|
|
android.support.design.widget.Snackbar} appears. For example, if the layout
|
|
has a {@link android.support.design.widget.FloatingActionButton}, the layout
|
|
moves the button up when it shows a {@link
|
|
android.support.design.widget.Snackbar}, instead of drawing the {@link
|
|
android.support.design.widget.Snackbar} on top of the button. You can see how
|
|
this looks in Figure 1.
|
|
</li>
|
|
</ul>
|
|
|
|
<p>
|
|
The {@link android.support.design.widget.CoordinatorLayout} class provides a superset
|
|
of the functionality of {@link android.widget.FrameLayout}. If your app
|
|
already uses a {@link android.widget.FrameLayout}, you can just replace that
|
|
layout with a {@link android.support.design.widget.CoordinatorLayout} to
|
|
enable the full {@link android.support.design.widget.Snackbar} functionality.
|
|
If your app uses other layout objects, the simplest thing to do is wrap your
|
|
existing layout elements in a {@link
|
|
android.support.design.widget.CoordinatorLayout}, as in this example:
|
|
</p>
|
|
|
|
<pre><android.support.design.widget.CoordinatorLayout
|
|
android:id="@+id/myCoordinatorLayout"
|
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="match_parent">
|
|
|
|
<!-- Here are the existing layout elements, now wrapped in
|
|
a CoordinatorLayout -->
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="match_parent"
|
|
android:orientation="vertical">
|
|
|
|
<!-- …Toolbar, other layouts, other elements… -->
|
|
|
|
</LinearLayout>
|
|
|
|
</android.support.design.widget.CoordinatorLayout></pre>
|
|
|
|
<p>
|
|
Make sure to set an <code>android:id</code> tag for your {@link
|
|
android.support.design.widget.CoordinatorLayout}. You need the layout's ID
|
|
when you display the message.
|
|
</p>
|
|
|
|
<div class="framed-nexus5-port-span-5" id="video-coord">
|
|
<video class="play-on-hover" autoplay loop
|
|
alt="If the Snackbar is attached to a CoordinatorLayout, the layout
|
|
moves other elements up when it shows the Snackbar.">
|
|
<!-- Preferred video size 216x384 (portrait) -->
|
|
<source src="{@docRoot}images/training/snackbar/snackbar_button_move.mp4">
|
|
</video>
|
|
</div>
|
|
|
|
<p class="img-caption">
|
|
<strong>Figure 1.</strong> The {@link android.support.design.widget.CoordinatorLayout}
|
|
moves the {@link android.support.design.widget.FloatingActionButton} up
|
|
when the {@link android.support.design.widget.Snackbar} appears.
|
|
</p>
|
|
|
|
<h2 id="display">
|
|
Display a Message
|
|
</h2>
|
|
|
|
<p>
|
|
There are two steps to displaying a message. First, you create a {@link
|
|
android.support.design.widget.Snackbar} object with the message text. Then,
|
|
you call that object's {@link android.support.design.widget.Snackbar#show
|
|
show()} method to display the message to the user.
|
|
</p>
|
|
|
|
<h3 id="create-snackbar">Creating a Snackbar object</h3>
|
|
|
|
<p>
|
|
Create a {@link android.support.design.widget.Snackbar} object by
|
|
calling the static {@link android.support.design.widget.Snackbar#make
|
|
Snackbar.make()} method. When you create the {@link
|
|
android.support.design.widget.Snackbar}, you specify both the message it
|
|
displays, and the length of time to show the message:
|
|
</p>
|
|
|
|
<pre>Snackbar mySnackbar = Snackbar.make(viewId, stringId, duration);</pre>
|
|
|
|
<dl>
|
|
<dt>
|
|
<em>viewId</em>
|
|
</dt>
|
|
|
|
<dd>
|
|
The view to attach the {@link android.support.design.widget.Snackbar} to.
|
|
The method actually searches up the view hierarchy from the passed
|
|
<em>viewId</em> until it reaches either a {@link
|
|
android.support.design.widget.CoordinatorLayout}, or the window decor's
|
|
content view. Ordinarily, it's simplest to just pass the ID of the {@link
|
|
android.support.design.widget.CoordinatorLayout} enclosing your content.
|
|
</dd>
|
|
|
|
<dt>
|
|
<em>stringId</em>
|
|
</dt>
|
|
|
|
<dd>
|
|
The resource ID of the message you want to display. This can be formatted
|
|
or unformatted text.
|
|
</dd>
|
|
|
|
<dt>
|
|
<em>duration</em>
|
|
</dt>
|
|
|
|
<dd>
|
|
The length of time to show the message. This can be either {@link
|
|
android.support.design.widget.Snackbar#LENGTH_SHORT LENGTH_SHORT} or {@link
|
|
android.support.design.widget.Snackbar#LENGTH_LONG LENGTH_LONG}.
|
|
</dd>
|
|
</dl>
|
|
|
|
<h3 id="show-snackbar">Showing the message to the user</h3>
|
|
|
|
<p>
|
|
Once you have created the {@link android.support.design.widget.Snackbar},
|
|
call its {@link android.support.design.widget.Snackbar#show show()} method to
|
|
display the {@link android.support.design.widget.Snackbar} to the user:
|
|
</p>
|
|
|
|
<pre>mySnackbar.show();</pre>
|
|
|
|
<p>
|
|
The system does not show multiple {@link
|
|
android.support.design.widget.Snackbar} objects at the same time, so if the
|
|
view is currently displaying another {@link
|
|
android.support.design.widget.Snackbar}, the system queues your {@link
|
|
android.support.design.widget.Snackbar} and displays it after the current
|
|
{@link android.support.design.widget.Snackbar} expires or is dismissed.
|
|
</p>
|
|
|
|
<p>
|
|
If you just want to show a message to the user and won't need to call any of
|
|
the {@link android.support.design.widget.Snackbar} object's utility methods,
|
|
you don't need to keep the reference to the {@link
|
|
android.support.design.widget.Snackbar} after you call {@link
|
|
android.support.design.widget.Snackbar#show show()}. For this reason, it's
|
|
common to use method chaining to create and show a {@link
|
|
android.support.design.widget.Snackbar} in one statement:
|
|
</p>
|
|
|
|
<pre>Snackbar.make(findViewById(R.id.myCoordinatorLayout), R.string.email_sent,
|
|
Snackbar.LENGTH_SHORT)
|
|
.show();</pre>
|