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-х статьях.
ОтветитьУдалить