From b8b3645a9799c38ad68549316ebbf7a4849f2e0c Mon Sep 17 00:00:00 2001
From: Scott Main <>
Date: Sun, 26 Apr 2009 15:50:49 -0700
Subject: [PATCH] AI 147803: add docs and images for docs on Toast and
Notification docs also edit the Notification class doc BUG=1800118
Automated import of CL 147803
---
core/java/android/app/Notification.java | 18 +-
docs/html/guide/guide_toc.cs | 4 +-
docs/html/guide/topics/ui/notifiers/index.jd | 107 +++++
.../topics/ui/notifiers/notifications.jd | 432 ++++++++++++++++++
docs/html/guide/topics/ui/notifiers/toasts.jd | 154 +++++++
docs/html/images/custom_message.png | Bin 0 -> 11120 bytes
docs/html/images/custom_toast.png | Bin 0 -> 19966 bytes
docs/html/images/notifications_window.png | Bin 0 -> 10511 bytes
docs/html/images/status_bar.png | Bin 0 -> 3719 bytes
docs/html/images/toast.png | Bin 0 -> 6544 bytes
10 files changed, 703 insertions(+), 12 deletions(-)
create mode 100644 docs/html/guide/topics/ui/notifiers/index.jd
create mode 100644 docs/html/guide/topics/ui/notifiers/notifications.jd
create mode 100644 docs/html/guide/topics/ui/notifiers/toasts.jd
create mode 100755 docs/html/images/custom_message.png
create mode 100755 docs/html/images/custom_toast.png
create mode 100755 docs/html/images/notifications_window.png
create mode 100755 docs/html/images/status_bar.png
create mode 100644 docs/html/images/toast.png
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 51fddb1145cbb..9834c75c58d4b 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -34,6 +34,9 @@ import android.widget.RemoteViews;
* A class that represents how a persistent notification is to be presented to
* the user using the {@link android.app.NotificationManager}.
*
+ *
For a guide to creating notifications, see the
+ * Creating Status
+ * Bar Notifications document in the Dev Guide.
*/
public class Notification implements Parcelable
{
@@ -52,7 +55,8 @@ public class Notification implements Parcelable
/**
* Use the default notification vibrate. This will ignore any given
- * {@link #vibrate}.
+ * {@link #vibrate}. Using phone vibration requires the
+ * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
*
* @see #defaults
*/
@@ -149,8 +153,7 @@ public class Notification implements Parcelable
/**
- * The pattern with which to vibrate. This pattern will repeat if {@link
- * #FLAG_INSISTENT} bit is set in the {@link #flags} field.
+ * The pattern with which to vibrate.
*
*
* To vibrate the default pattern, see {@link #defaults}.
@@ -228,13 +231,8 @@ public class Notification implements Parcelable
/**
* Bit to be bitwise-ored into the {@link #flags} field that if set,
- * the audio and vibration will be repeated until the notification is
- * cancelled.
- *
- *
- * NOTE: This notion will change when we have decided exactly
- * what the UI will be.
- *
+ * the audio will be repeated until the notification is
+ * cancelled or the notification window is opened.
*/
public static final int FLAG_INSISTENT = 0x00000004;
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index 39f4abffba63e..5367cb2e7ec55 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -19,9 +19,9 @@
- Declaring Layout
- Creating Menus
-
+ - Creating Dialogs
- Handling UI Events
-
+ - Notifying the User
- Applying Styles and Themes
- Building Custom Components
- Binding to Data with AdapterView
diff --git a/docs/html/guide/topics/ui/notifiers/index.jd b/docs/html/guide/topics/ui/notifiers/index.jd
new file mode 100644
index 0000000000000..5b37f5b623aa5
--- /dev/null
+++ b/docs/html/guide/topics/ui/notifiers/index.jd
@@ -0,0 +1,107 @@
+page.title=Notifying the User
+@jd:body
+
+
+
+Several types of situations may arise that require you to notify the user
+about an event that occurs in your application. Some events require the user to respond
+and others do not. For example:
+
+ - When an event such as saving a file is complete, a small message
+should appear to confirm that the save was successful.
+ - If the application is running in the background and needs the user's attention,
+the application should create a notificaiton that allows the user to respond at
+his or her convenience.
+ - If the application is
+performing work that the user must wait for (such as loading a file),
+the application should show a hovering progress wheel or bar.
+
+
+Each of these notification tasks can be achieved using a different technique:
+
+
+This document summarizes each of these techniques for notifying the user and includes
+links to full documentation.
+
+
+Toast Notification
+
+
+
+A toast notificaiton is a message that pops up on the surface of the window.
+It only fills the amount of space required for the message and the user's current
+activity remains visible and interactive. The notification automatically fades in and
+out, and does not accept interaction events. Because a toast can be created from a background
+{@link android.app.Service}, it appears even if the application isn't visible.
+
+A toast is best for short text messages, such as "File saved,"
+when you're fairly certain the user is paying attention
+to the screen. A toast can not accept user interaction events; if you'd like
+the user to respond and take action, consider using a
+Status Bar Notification instead.
+
+For more information, refer to Creating Toast Notifications.
+
+
+Status Bar Notification
+
+
+
+A status bar notification adds an icon to the system's status bar
+(with an optional ticker-text message) and an expanded message in the "Notifications" window.
+When the user selects the expanded message, Android fires an
+{@link android.content.Intent} that is defined by the notification (usually to launch an
+{@link android.app.Activity}).
+You can also configure the notification to alert the user with a sound, a vibration, and flashing
+lights on the device.
+
+This kind of notification is ideal when your application is working in
+a background {@link android.app.Service} and needs to
+notify the user about an event. If you need to alert the user about an event that occurs
+while your Activity is still in focus, consider using a
+Dialog Notification instead.
+
+For more information, refer to
+Creating Status Bar Notifications.
+
+
+Dialog Notification
+
+
+
+A dialog is usually a small window that appears in front of the current Activity.
+The underlying Activity loses focus and the dialog accepts all user interaction.
+Dialogs are normally used
+for notifications and short activities that directly relate to the application in progress.
+
+You should use a dialog when you need to show a progress bar or a short
+message that requires confirmation from the user (such as an alert with "OK" and "Cancel" buttons).
+You can use also use dialogs as integral componenents
+in your application's UI and for other purposes besides notifications.
+For a complete discussion on all the available types of dialogs,
+including its uses for notifications, refer to
+Creating Dialogs.
+
+
+
diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd
new file mode 100644
index 0000000000000..e6fa48fe2385a
--- /dev/null
+++ b/docs/html/guide/topics/ui/notifiers/notifications.jd
@@ -0,0 +1,432 @@
+page.title=Creating Status Bar Notifications
+parent.title=Notifying the User
+parent.link=index.html
+@jd:body
+
+
+
+A status bar notification adds an icon to the system's status bar
+(with an optional ticker-text message) and an expanded message in the "Notifications" window.
+When the user selects the expanded message, Android fires an
+{@link android.content.Intent} that is defined by the notification (usually to launch an
+{@link android.app.Activity}).
+You can also configure the notification to alert the user with a sound, a vibration, and flashing
+lights on the device.
+
+A status bar notification should be used for any case in
+which a background Service needs to alert the user about an event that requires a response. A background Service
+should never launch an Activity on its own in order to receive user interaction.
+The Service should instead create a status bar notification that will launch the Activity
+when selected by the user.
+
+The screenshot below shows the status bar with a notification icon on the left side.
+
+
+The next screenshot shows the notification's expanded message in the "Notifications" window.
+The user can reveal the Notifications window by pulling down the status bar
+(or selecting Notifications from the Home options menu).
+
+
+
+The Basics
+
+An {@link android.app.Activity} or {@link android.app.Service} can initiate a status bar
+notification. Because an Activity can perform actions only while it is
+active and in focus, you should create your status bar notifications from a
+Service. This way, the notification can be created from the background,
+while the user is using another application or
+while the device is asleep. To create a notification, you must use two
+classes: {@link android.app.Notification} and {@link android.app.NotificationManager}.
+
+Use an instance of the {@link android.app.Notification} class to define the properties of your
+status bar notification, such as the status bar icon, the expanded message, and extra settings such
+as a sound to play. The {@link android.app.NotificationManager} is an Android system service that
+executes and manages all Notifications. You do not instantiate the NotificationManager. In order
+to give it your Notification, you must retrieve a reference to the NotificationManager with
+{@link android.app.Activity#getSystemService(String) getSystemService()} and
+then, when you want to notify the user, pass it your Notification object with
+{@link android.app.NotificationManager#notify(int,Notification) notify()}.
+
+To create a status bar notification:
+
+ - Get a reference to the NotificationManager:
+
+String ns = Context.NOTIFICATION_SERVICE;
+NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
+
+
+ - Instantiate the Notification:
+
+int icon = R.drawable.notification_icon;
+CharSequence tickerText = "Hello";
+long when = System.currentTimeMillis();
+
+Notification notification = new Notification(icon, tickerText, when);
+
+
+ - Define the Notification's expanded message and Intent:
+
+Context context = getApplicationContext();
+CharSequence contentTitle = "My notification";
+CharSequence contentText = "Hello World!";
+Intent notificationIntent = new Intent(this, MyClass.class);
+PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+
+notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
+
+
+ - Pass the Notification to the NotificationManager:
+
+private static final int HELLO_ID = 1;
+
+mNotificationManager.notify(HELLO_ID, notification);
+
+ That's it. Your user has now been notified.
+
+
+
+
+Managing your Notifications
+
+The {@link android.app.NotificationManager} is a system service that manages all
+notifications. You must retrieve a reference to it with the
+{@link android.app.Activity#getSystemService(String) getSystemService()} method.
+For example:
+
+String ns = Context.NOTIFICATION_SERVICE;
+NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
+
+
+When you want to send your status bar notification, pass the Notification object
+to the NotificationManager with {@link android.app.NotificationManager#notify(int,Notification)}.
+The first parameter is the unique ID for the Notification and the second is the Notification object.
+The ID uniquely identifies the Notification from within your
+application. This is necessary if you need to update the Notification or (if
+your application manages different kinds of Notifications) select the appropriate action
+when the user returns to your application via the Intent defined in the Notification.
+
+To clear the status bar notification when the user selects it from the Notifications
+window, add the "FLAG_AUTO_CANCEL" flag to your Notification object. You can also clear it
+manually with {@link android.app.NotificationManager#cancel(int)}, passing it the notification ID,
+or clear all your Notifications with {@link android.app.NotificationManager#cancelAll()}.
+
+
+Creating a Notification
+
+A {@link android.app.Notification} object defines the details of the notification
+message that is displayed in the status bar and "Notifications" window, and any other
+alert settings, such as sounds and blinking lights.
+
+A status bar notification requires all of the following:
+
+ - An icon for the status bar
+ - A title and expanded message for the expanded view (unless you define a
+ custom expanded view)
+ - A {@link android.app.PendingIntent}, to be fired when the notification is selected
+
+Optional settings for the status bar notification include:
+
+ - A ticker-text message for the status bar
+ - An alert sound
+ - A vibrate setting
+ - A flashing LED setting
+
+
+The starter-kit for a new Notification includes the
+{@link android.app.Notification#Notification(int,CharSequence,long)} constructor and the
+{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)}
+method. These define all the required settings for a Notification.
+The following snippet demonstrates a basic Notification setup:
+
+int icon = R.drawable.notification_icon; // icon from resources
+CharSequence tickerText = "Hello"; // ticker-text
+long when = System.currentTimeMillis(); // notification time
+Context context = getApplicationContext(); // application Context
+CharSequence contentTitle = "My notification"; // expanded message title
+CharSequence contentText = "Hello World!"; // expanded message text
+
+Intent notificationIntent = new Intent(this, MyClass.class);
+PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+
+// the next two lines initialize the Notification, using the configurations above
+Notification notification = new Notification(icon, tickerText, when);
+notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
+
+
+
+Updating the notification
+
+You can update the information in your status bar notification as events
+continue to occur in your application. For example, when a new SMS text message arrives
+before previous messages have been read, the Messaging application updates the existing
+notification to display the total number of new messages received.
+This practice of updating an existing Notification is much better than adding new Notifications
+to the NotificationManager because it avoids clutter in the Notifications window.
+
+Because each notification is uniquely identified
+by the NotificationManager with an integer ID, you can revise the notification by calling
+{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+setLatestEventInfo()} with new values, change some field values of the Notification, and then call
+{@link android.app.NotificationManager#notify(int,Notification) notify()} again.
+
+You can revise each property with the object member fields
+(except for the Context and the expanded message title and text). You should always
+revise the text message when you update the notification by calling
+{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+setLatestEventInfo()} with new values for contentTitle and contentText.
+Then call {@link android.app.NotificationManager#notify(int,Notification) notify()} to update the
+notification. (Of course, if you've created a custom expanded
+view, then updating these title and text values has no effect.)
+
+
+Adding a sound
+
+You can alert the user with the default notification sound
+(which is defined by the user) or with a sound specified by your application.
+
+To use the user's default sound, add "DEFAULT_SOUND" to the defaults field:
+
+notification.defaults |= Notification.DEFAULT_SOUND;
+
+
+To use a different sound with your notifications, pass a Uri reference to the
+sound field.
+The following example uses a known audio file saved to the device SD card:
+
+notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
+
+
+In the next example, the audio file is chosen from the internal
+{@link android.provider.MediaStore.Audio.Media MediaStore}'s {@link android.content.ContentProvider}:
+
+notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
+
+
+In this case, the exact ID of the media file ("6") is known and appended to the content
+{@link android.net.Uri}. If you don't know the exact ID, you must query all the
+media available in the MediaStore with a {@link android.content.ContentResolver}.
+See the Content Providers
+documentation for more information on using a ContentResolver.
+
+If you want the sound to continuously repeat until the user responds to the notification
+or the notification is cancelled, add "FLAG_INSISTENT" to the flags field.
+
+Note: If the defaults field includes
+"DEFAULT_SOUND", then the default sound overrides any sound defined by the sound field.
+
+
+Adding vibration
+
+You can alert the user with the the default
+vibration pattern or with a vibration pattern defined by your application.
+
+To use the default pattern, add "DEFAULT_VIBRATE" to the defaults field:
+
+notification.defaults |= Notification.DEFAULT_VIBRATE;
+
+
+To define your own vibration pattern, pass an array of long values to the
+vibrate field:
+
+long[] vibrate = {0,100,200,300};
+notification.vibrate = vibrate;
+
+
+The long array defines the alternating pattern for the length of vibration off and on
+(in milliseconds). The first value is how long to wait (off) before beginning, the second
+value is the length of the first vibration, the third is the next length off, and so on.
+The pattern can be as long as you like, but it can't be set to repeat.
+
+
+Note: If the defaults field includes
+"DEFAULT_VIBRATE", then the default vibration overrides any vibration defined by the
+vibrate field.
+
+
+Adding flashing lights
+
+To alert the user by flashing LED lights, you can implement the default
+light pattern (if available), or define your own color and pattern for the lights.
+
+To use the default light setting, add "DEFAULT_LIGHTS" to the defaults field:
+
+notification.defaults |= Notification.DEFAULT_LIGHTS;
+
+
+To define your own color and pattern, define a value for the ledARGB field
+(for the color), the ledOffMS field (length of time, in milliseconds, to
+keep the light off), the ledOnMS (length of time, in milliseconds, to keep the light on),
+and also add "FLAG_SHOW_LIGHTS" to the flags field:
+
+notification.ledARGB = 0xff00ff00;
+notification.ledOnMS = 300;
+notification.ledOffMS = 1000;
+notification.flags |= Notification.FLAG_SHOW_LIGHTS;
+
+
+In this example, the green light repeatedly flashes on for 300 milliseconds and
+turns off for one second. Not every color in the spectrum is supported by the
+device LEDs, and not every device supports the same colors, so the hardware
+estimates to the best of its ability. Green is the most common notification color.
+
+
+More features
+
+You can add several more features to your notifications
+using Notification fields and flags. Some useful features include the following:
+
+
+ - "FLAG_AUTO_CANCEL" flag
+ - Add this to the flags field to automatically cancel the notification
+ after it is selected from the Notifications window.
+ - "FLAG_INSISTENT" flag
+ - Add this to the flags field to repeat the audio until the
+ user responds.
+ - "FLAG_ONGOING_EVENT" flag
+ - Add this to the flags field to group the notification under the "Ongoing"
+ title in the Notifications window. This indicates that the application is on-going —
+ its processes is still running in the background, even when the application is not
+ visible (such as with music or a phone call).
+ - "FLAG_NO_CLEAR" flag
+ - Add this to the flags field to indicate that the notification should
+ not be cleared by the "Clear notifications" button. This is particularly useful if
+ your notification is on-going.
+ - number field
+ - This value indicates the current number of events represented by the notification.
+ The appropriate number is overlayed on top of the status bar icon.
+ If you intend to use this field, then you must start with "1" when the Notification is first
+ created. (If you change the value from zero to anything greater during an update, the number
+ is not shown.)
+ - iconLevel field
+ - This value indicates the current level of a
+ {@link android.graphics.drawable.LevelListDrawable} that is used for the notification icon.
+ You can animate the icon in the status bar by changing this value to correlate with the
+ drawable's defined in a LevelListDrawable. See the {@link android.graphics.drawable.LevelListDrawable}
+ reference for more information.
+
+
+See the {@link android.app.Notification} class reference for more information about additional
+features that you can customize for your application.
+
+
+Creating a Custom Expanded View
+
+
+
+By default, the expanded view used in the "Notifications" window includes a basic title and text
+message. These are defined by the contentTitle and contentText
+parameters of the {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+setLatestEventInfo()} method. However, you can also define a custom layout for the expanded view using
+{@link android.widget.RemoteViews}. The screenshot to the right shows an example of a
+custom expanded view that uses an ImageView and TextView in a LinearLayout.
+
+To define your own layout for the expanded message,
+instantiate a {@link android.widget.RemoteViews} object and
+pass it to the contentView field of your Notification. Pass the
+{@link android.app.PendingIntent} to the contentIntent field.
+
+Creating a custom expanded view is best understood with an example:
+
+
+ - Create the XML layout for the expanded view.
+ For example, create a layout file called
custom_notification_layout.xml and
+ build it like so:
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="3dp"
+ >
+ <ImageView android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginRight="10dp"
+ />
+ <TextView android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:textColor="#000"
+ />
+</LinearLayout>
+
+
+ This layout is used for the expanded view,
+ but the content of the ImageView and TextView still needs to be defined by the applicaiton.
+ RemoteViews offers some convenient methods that allow you to define this content...
+
+
+ - In the application code, use the RemoveViews
+ methods to define the image and text. Then pass the RemoteViews object to the contentView
+ field of the Notification, as shown in this example:
+
+RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
+contentView.setImageViewResource(R.id.image, R.drawable.notification_image);
+contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view");
+notification.contentView = contentView;
+
+
+ As shown here, pass the applicaiton's package name and the layout
+ resource ID to the RemoteViews constructor. Then, define the content for the ImageView and TextView,
+ using the {@link android.widget.RemoteViews#setImageViewResource(int, int) setImageViewResource()}
+ and {@link android.widget.RemoteViews#setTextViewText(int, CharSequence) setTextViewText()}.
+ In each case, pass the reference ID of the appropriate View object that you want to set, along with
+ the value for that View. Finally, the RemoteViews object is passed to the Notification in the
+ contentView field.
+
+
+ - Because you don't need the
+ {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+ setLatestEventInfo()} method when using a custom view, you must define the Intent for the Notification
+ with the contentIntent field, as in this example:
+
+Intent notificationIntent = new Intent(this, MyClass.class);
+PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+notification.contentIntent = contentIntent;
+
+
+
+ - The notification can now be sent as usual:
+
mNotificationManager.notify(CUSTOM_VIEW_ID, notification);
+
+
+
+
+The RemoteViews class also includes methods that you can use to easily add a
+{@link android.widget.Chronometer} or {@link android.widget.ProgressBar}
+in your notification's expanded view. For more information about creating custom layouts with
+RemoteViews, refer to the {@link android.widget.RemoteViews} class reference.
+
+Note:
+When creating a custom expanded view, you must take special care to ensure that your
+custom layout functions properly in different device orientations and resolutions. While this
+advice applies to all View layouts created on Android, it is especially important in this case
+because your layout real estate is very restricted. So don't make your custom layout too
+complex and be sure to test it in various configurations.
+
+
+
+
diff --git a/docs/html/guide/topics/ui/notifiers/toasts.jd b/docs/html/guide/topics/ui/notifiers/toasts.jd
new file mode 100644
index 0000000000000..a800c3c900dfd
--- /dev/null
+++ b/docs/html/guide/topics/ui/notifiers/toasts.jd
@@ -0,0 +1,154 @@
+page.title=Creating Toast Notifications
+parent.title=Notifying the User
+parent.link=index.html
+@jd:body
+
+
+
+A toast notificaiton is a message that pops up on the surface of the window.
+It only fills the amount of space required for the message and the user's current
+activity remains visible and interactive. The notification automatically fades in and
+out, and does not accept interaction events.
+
+The screenshot below shows an example toast notification from the Alarm application.
+Once an alarm is turned on, a toast is displayed to assure you that the
+alarm was set.
+
+
+A toast can be created and displayed from an {@link android.app.Activity} or
+{@link android.app.Service}. If you create a toast notification from a Service, it
+appears in front of the Activity currently in focus.
+
+If user response to the notification is required, consider using a
+Status Bar Notification.
+
+
+The Basics
+
+First, instantiate a {@link android.widget.Toast}
+object with one of the {@link android.widget.Toast#makeText(Context,int,int) makeText()} methods.
+This method takes three parameters: the application {@link android.content.Context},
+the text message, and the duration for the toast. It returns a properly initialized Toast
+object. You can display the toast notification with {@link android.widget.Toast#show()},
+as shown in the following example:
+
+
+Context context = getApplicationContext();
+CharSequence text = "Hello toast!";
+int duration = Toast.LENGTH_SHORT;
+
+Toast toast = Toast.makeText(context, text, duration);
+toast.show();
+
+
+This example demonstrates everything you need for most toast notifications.
+You should rarely need anything else. You may, however, want to position the
+toast differently or even use your own layout instead of a simple text message.
+The following sections describe how you can do these things.
+
+You can also chain your methods and avoid holding on to the Toast object, like this:
+Toast.makeText(context, text, duration).show();
+
+
+Positioning your Toast
+
+A standard toast notification appears near the bottom of the screen, centered horizontally.
+You can change this position with the {@link android.widget.Toast#setGravity(int,int,int)}
+method. This accepts three parameters: a {@link android.view.Gravity} constant,
+an x-position offset, and a y-position offset.
+
+For example, if you decide that the toast should appear in the top-left corner, you can set the
+gravity like this:
+
+toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
+
+
+If you want to nudge the position to the right, increase the value of the second parameter.
+To nudge it down, increase the value of the last parameter.
+
+
+
Creating a Custom Toast View
+
+
+
+If a simple text message isn't enough, you can create a customized layout for your
+toast notification. To create a custom layout, define a View layout,
+in XML or in your application code, and pass the root {@link android.view.View} object
+to the {@link android.widget.Toast#setView(View)} method.
+
+For example, you can create the layout for the toast visible in the screenshot to the right
+with the following XML (saved as toast_layout.xml):
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/toast_layout_root"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="10dp"
+ android:background="#DAAA"
+ >
+ <ImageView android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginRight="10dp"
+ />
+ <TextView android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:textColor="#FFF"
+ />
+</LinearLayout>
+
+
+Notice that the ID of the LinearLayout element is "toast_layout". You must use this
+ID to inflate the layout from the XML, as shown here:
+
+
+LayoutInflater inflater = getLayoutInflater();
+View layout = inflater.inflate(R.layout.toast_layout,
+ (ViewGroup) findViewById(R.id.toast_layout_root));
+
+ImageView image = (ImageView) layout.findViewById(R.id.image);
+image.setImageResource(R.drawable.android);
+TextView text = (TextView) layout.findViewById(R.id.text);
+text.setText("Hello! This is a custom toast!");
+
+Toast toast = new Toast(getApplicationContext());
+toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
+toast.setDuration(Toast.LENGTH_LONG);
+toast.setView(layout);
+toast.show();
+
+
+First, retrieve the {@link android.view.LayoutInflater} with
+{@link android.app.Activity#getLayoutInflater()}
+(or {@link android.content.Context#getSystemService(String) getSystemService()}),
+and then inflate the layout from XML using
+{@link android.view.LayoutInflater#inflate(int, ViewGroup)}. The first parameter
+is the layout resource ID and the second is the root View. You can use
+this inflated layout to find more View objects in the layout, so now capture and
+define the content for the ImageView and TextView elements. Finally, create
+a new Toast with {@link android.widget.Toast#Toast(Context)} and set some properties
+of the toast, such as the gravity and duration. Then call
+{@link android.widget.Toast#setView(View)} and pass it the inflated layout.
+You can now display the toast with your custom layout by calling
+{@link android.widget.Toast#show()}.
+
+Note: Do not use the public constructor for a Toast
+unless you are going to define the layout with {@link android.widget.Toast#setView(View)}.
+If you do not have a custom layout to use, you must use
+{@link android.widget.Toast#makeText(Context,int,int)} to create the Toast.
+
diff --git a/docs/html/images/custom_message.png b/docs/html/images/custom_message.png
new file mode 100755
index 0000000000000000000000000000000000000000..ea7c7160e020ce0436aac94c3c950542201f6f3b
GIT binary patch
literal 11120
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
RkoW)q002ovPDHLkV1o8bEf)X)
literal 0
HcmV?d00001
diff --git a/docs/html/images/status_bar.png b/docs/html/images/status_bar.png
new file mode 100755
index 0000000000000000000000000000000000000000..420bb03be861f29345a39fbf7f9f525e260b7aa8
GIT binary patch
literal 3719
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