Custom Notification View

前端 未结 1 752
無奈伤痛
無奈伤痛 2021-02-02 17:49

I would like to create a notification icon view that looks similar to the Google+ app\'s notification. The difference will be that I need to be able to change the color at runti

相关标签:
1条回答
  • 2021-02-02 18:33

    I solved this by doing the following.

    Created this to make the rounded corner shape with a solid color. This also adds a translucent black to give it a pressed look against a blackground. res/drawable/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>
    

    The layer drawable will be used as the actual drawable on the action bar item. It has the background (written above) overlayed with the wrench icon. res/drawable/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 code to change the color. The target view is the object that is assigned the layer_customizer drawable. The color passed in will change the shape_notification.xml's solid tag color.

    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();
    }
    

    Create a layout using these layers. res/layout/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" />
    

    To get the custom layout to put into the ActionBar add this menu item into it: res/menu/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"
       />
    

    Then after loading the Action Bar use this code to get the handle to the button. This happens in your Activity.

    @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);
            }
        });
    }
    

    If you want to see the full source working together look at the app source code I use this in. http://code.google.com/p/motivatormaker-android/source/browse/MakeMotivator/src/com/futonredemption/makemotivator/activities/MainActivity.java

    0 讨论(0)
提交回复
热议问题