Пользовательский просмотр уведомлений - PullRequest
12 голосов
/ 27 января 2012

Я хотел бы создать представление значка уведомления, которое будет похоже на уведомление приложения Google+. Разница будет в том, что мне нужно будет менять цвет во время выполнения, когда значки Google+ серые или красные, поэтому я предполагаю, что они используют StateListDrawable.

Каков наилучший подход для этого? Я бы предпочел иметь закругленные обрезанные углы и иметь возможность рисовать внутри. Этот пользовательский вид также будет помещен в панель действий. Мне все еще нужно представление, чтобы отвечать на android: фоновые рисунки списка состояний, чтобы можно было работать с щелчком и выбранным соответствием.

Этот пользовательский вид также будет размещен на панели действий.

Google+ app with the notification icon in the upper right that's grayed out and has a 0 in the middle.

1 Ответ

23 голосов
/ 13 февраля 2012

Я решил это, выполнив следующее.

Создано, чтобы сделать форму закругленного угла сплошным цветом. Это также добавляет прозрачный черный цвет, чтобы придать ему прижатый вид на черном фоне. Рез / рисуем / shape_notification.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <stroke android:color="#33000000" android:width="2dp"/>
    <corners android:radius="4dp" />
    <solid android:color="#99333333"/>
</shape>

Слой, который можно нарисовать, будет использоваться как фактический элемент на панели действий. Он имеет фон (написано выше), наложенный на значок гаечного ключа. Рез / рисуем / layer_customizer.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/shape_notification" />
    <item android:drawable="@drawable/ic_menu_preferences" />
</layer-list>

Java-код для изменения цвета. Целевой вид - это объект, которому назначен слой layer_customizer. Переданный цвет изменит цвет сплошного тега shape_notification.xml.

public static void setCustomizerDrawableColor(final View target, final int color) {
  final Drawable d = target.getDrawable();
  LayerDrawable layer = (LayerDrawable)d;
  GradientDrawable gradient = (GradientDrawable)layer.getDrawable(0);
  gradient.setColor(color);
  gradient.invalidateSelf();
  layer.invalidateSelf();
  target.invalidate();
}

Создание макета с использованием этих слоев. Рез / макет / actionview_customizer.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/ActionViewCustomizer"
    android:src="@drawable/layer_customizer"
    android:contentDescription="@string/customize"
    style="@style/ActionBarButton" />

Чтобы пользовательский макет был помещен в ActionBar, добавьте в него этот пункт меню: Рез / меню / actionbar_main.xml

<item android:id="@+id/MenuItemCustomize"
  android:icon="@drawable/layer_customizer"
  android:title="@string/customize"
  android:showAsAction="always"
  android:actionLayout="@layout/actionview_customizer"
   />

Затем после загрузки панели действий используйте этот код, чтобы получить указатель на кнопку. Это происходит в вашей деятельности.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.actionbar_main, menu);
    final ActionBar actionBar = getActionBar();
    final MenuItem customizerItem = menu.findItem(R.id.MenuItemCustomize);
    View v = customizerItem.getActionView();
    customizerActionView = (ImageButton) v;
    customizerActionView.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            onOptionsItemSelected(customizerItem);
        }
    });
}

Если вы хотите, чтобы весь исходный код работал вместе, посмотрите на исходный код приложения, в котором я использую это. http://code.google.com/p/motivatormaker-android/source/browse/MakeMotivator/src/com/futonredemption/makemotivator/activities/MainActivity.java

...