1. Всплывающие уведомления рисуются с помощью класса Toast. В прошлом примере мы делали это так:
- Toast.makeText (getApplicationContext(), «Text», ).show();
 
- Toast myToast = Toast.makeText (Context context, String text, int duration);
 - myToast.show();
 
2. Вывести уведомления можно также в строку состояния. Чаще такой вид уведомлений используется для приложений работающих в фоновом режиме и в нашем списке это не особо надо, но для примера разберемся. Для этого нам понадобятся два класса:
Notification — класс формирующий уведомление
Notification(int icon, CharSequence tickerText, long when)
тут вполне очевидно: icon и tickerText — иконка и текст, отображающиеся в строке уведомления, when — время вывода уведомления.
В Notification нас еще интересует метод, описывающий как будет выглядеть уведомление при просмотре. setLatestEventInfo(Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)
тут context — текущий контекст
contentTitle и contentText — заголовок и текст сообщения
contentIntent — окно открываемое при нажатие на уведомление.
Второй класс NotificationManager, который собственно и выводит наше уведомление. Для этого используется метод
notify(int id, Notification notification) или
notify(String tag, int id, Notification notification) Каждое уведомление имеет id и необязательный tag. Эти параметры уникально определяют уведомление для системы. При вызове метода notify с уже существующими id и tag, уведомление не создается заново, а обновляется.
Создать экземпляр класса NotificationManager напрямую нельзя, поэтому будем использовать метод getSystemService(String) (из класса Context), который возвращает указатель на системную службу.
Также будут использоваться классы Intent и PendingIntent. Эти два класса вообще заслуживают отдельного детального разбирательства, но вкратце они позволяют нам запускать приложение или сервис.
Поехали. В начале, в класс SimpleList добавляем атрибуты
- public class SimpleList extends ListActivity {
 - ...
 - myAdapter mAdapter;
 - private static final int NOTIFY_ID = 101;
 - private NotificationManager myNotifyMgr;
 - ...
 - }
 
В методе onCreate получаем указатель на службу уведомлений
- public void onCreate(Bundle savedInstanceState) {
 - ...
 - myNotifyMgr = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
 - }
 
И наконец в метод onListItemClick пишем вызов уведомления
- public void onListItemClick (ListView parent, View v, int position, long id) {
 - //** Всплывающее уведомление
 - Toast.makeText (getApplicationContext(), mAdapter.getString(position), Toast.LENGTH_SHORT).show();
 - //** Уведомление в строке состояния
 - // Определяем параметры, которые будем выводить
 - CharSequence Title = "Выбран элемент";
 - int icon = mImage[position];
 - CharSequence Text = mAdapter.getString(position);
 - // Определяем окно, которое будет открываться (SimpleList.class — класс с этим примером)
 - Intent notificationIntent = new Intent (this, SimpleList.class);
 - PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
 - // Выводим уведомление
 - Notification notification = new Notification(icon, Title, System.currentTimeMillis());
 - notification.setLatestEventInfo(getApplicationContext(), Title, Text, contentIntent);
 - myNotifyMgr.notify(NOTIFY_ID, notification);
 - }
 
Запускаем. Теперь при нажатии на элемент списка у нас появляется не только серое окошко, но и новое уведомление в строке состояния. При последовательном выборе нескольких элементов, уведомление будет изменяться. Если изменить строчку
- myNotifyMgr.notify(NOTIFY_ID, notification);
 
на например такое
- myNotifyMgr.notify((new Random()).nextInt(100), notification);
 
то при выборе нескольких строк, уведомления начнут плодиться как кролики )) ((new Random()).nextInt(100) — генерация случайного числа от 0 до 100)
3. Теперь украсим оба этих уведомления. Способ изменения внешнего вида похож на тот, который мы уже использовали в прошлый раз для изменения пунктов списка. Итак, для начала создаем xml-разметку для уведомления, например так: (notify.xml)
- <?xml version="1.0" encoding="utf-8"?>
 - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:id="@+id/linear_layout"
 - android:layout_height="wrap_content"
 - android:layout_width="wrap_content"
 - android:orientation="vertical"
 - android:background="@drawable/bg"
 - android:gravity="center"
 - android:minWidth="150px"
 - >
 - <ImageView
 - android:id="@+id/Image"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - />
 - <TextView
 - android:id="@+id/Sign"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:textSize="20sp"
 - android:textStyle="bold"
 - android:textColor="#000000"
 - />
 - <TextView
 - android:id="@+id/Date"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:textSize="14sp"
 - android:textStyle="italic"
 - android:textColor="#000000"
 - />
 - </LinearLayout>
 
- public void onListItemClick (ListView parent, View v, int position, long id) {
 - // Всплывающее уведомление
 - LayoutInflater mInflater = getLayoutInflater();
 - View mLayout = mInflater.inflate(R.layout.notify, null);
 - ImageView image = (ImageView)mLayout.findViewById(R.id.Image);
 - image.setImageResource(mImage[position]);
 - TextView sign = (TextView)mLayout.findViewById(R.id.Sign);
 - sign.setText(mSign[position]);
 - TextView date = (TextView)mLayout.findViewById(R.id.Date);
 - date.setText(mDate[position]);
 - Toast toast = new Toast (getApplicationContext());
 - toast.setDuration(Toast.LENGTH_LONG);
 - toast.setView(mLayout);
 - toast.show();
 - ...
 - }
 
- public void onListItemClick (ListView parent, View v, int position, long id) {
 - ...
 - // Уведомление в строке состояния
 - CharSequence Title = "Выбран элемент " + mSign[position];
 - int icon = mImage[position];
 - Intent notificationIntent = new Intent (this, SimpleList.class);
 - PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
 - RemoteViews mRemoteView = new RemoteViews(getPackageName(), R.layout.notify);
 - mRemoteView.setImageViewResource(R.id.Image, mImage[position]);
 - mRemoteView.setTextViewText(R.id.Sign, mSign[position]);
 - mRemoteView.setTextViewText(R.id.Date, mDate[position]);
 - Notification notification = new Notification(icon, Title, System.currentTimeMillis());
 - notification.contentIntent = contentIntent;
 - notification.contentView = mRemoteView;
 - myNotifyMgr.notify(NOTIFY_ID, notification);
 - }
 
Есть ошибки в 2-х статьях.
ОтветитьУдалить