Android:如何创建自定义通知并编辑其以编程方式添加视图的布局?

时间:2012-07-19 09:01:41

标签: android android-layout android-view android-notifications

我想知道如何创建自定义通知,编辑是以编程方式添加视图以允许用户自定义通知。

我不能做的是:

如果我创建这样的自定义LinearLayout:

LinearLayout ll = new LinearLayout(c);
ImageView iv = new ImageView(c);
iv.setImageResource(R.drawable.bt_close);
ll.addView(iv);

如何使用此布局创建通知并添加要在单击ImageView时执行的操作?

制作自定义通知的代码只是这个?

Notification notification = (statusIcon, appName, System.currentTimeMillis());
notification.contentView = new RemoteViews(this.getPackageName(),R.layout.notification);

非常感谢...

2 个答案:

答案 0 :(得分:1)

通知区域使用RemoteViews就像Android App Widgets一样。

它们与应用程序中的UI部分不同。您可以参考它们,您可以创建它们但它们驻留在其他应用程序中。 (通知的UI位于系统应用程序中,应用程序小部件位于Home Launcher应用程序中。)

由于它们并未真正显示在您的应用中,因此您无法直接访问它们。例如,您无法设置onClickListener

这就是我们RemoteViews的原因。

使用它们,您可以通过提供布局文件和一些内置函数来定义如何创建它们来更改文本,图像等。当单击按钮时,您可以激活PendingIntent。而已。

最后,您实际上可以动态更改通知中的用户界面,但不能按照通常在应用中的方式进行更改。

您可以看到如何创建一个答案。 https://stackoverflow.com/a/21283668/1016462

答案 1 :(得分:0)

使用通知样式,您可以通过重新创建具有新样式的新通知来更改它。它的成本很小(如刷新)。但是有效。

第一步让你的对象成为公共静态。

示例:

public static NotificationCompat.Builder mBuilder;
public static RemoteViews contentBigCustom;
public static RemoteViews contentSmallNotExpand;
public static RemoteViews contentBigCustomFROMCODE;

接下来 - 制作此行:

notification.contentView = contentBigCustom;

看起来像:

 // in top 
 public static RemoteViews contentAny;

也许你正在使用onStartCommand初始对象很好......

 if (IWANTNOTIFYSTYLE == 0) {
contentBigCustom = RemoteViews(this.getPackageName(),R.layout.notificationBig);
}
else {
contentBigCustomFROMCODE = RemoteViews(this.getPackageName(),R.layout.notificationBig);
}

contentSmallNotExpand = RemoteViews(this.getPackageName(),R.layout.notificationSmall);

contentBigCustomFROMCODE = RemoteViews(this.getPackageName(),R.layout.notificationBig);

   mBuilder = new NotificationCompat.Builder(this);
        mBuilder.setDefaults(Notification.DEFAULT_ALL);
        mBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
        mBuilder.setSmallIcon(R.drawable.play);
        mBuilder.setContentText("This text is not in function but its needed to create notify");
        mBuilder.setLargeIcon(icon);
        mBuilder.setPriority(Notification.PRIORITY_MAX);
        mBuilder.setContent(contentSmallNotExpand);
        mBuilder.setCustomBigContentView(contentBigCustom);

   After notify exe line :     

mNotificationManager.notify(0,mBuilder.build());

put : 

stopSelf()

太杀服务了。当您想要更改样式时,请重新启动服务并为样式1 2 ... n设置动作ID。   它看起来像刷新,因为我们重新创建新的通知栏。   这只是100%的方式!   如果有人认为不同,请发给我链接到应用示例。

您可以将Activity对象也设为公共静态。

现在很容易控制任何组合:

服务 - 活动  服务 - BroadcastReceiver  BroadcastReceiver - 活动

但是! :

Service1.contentNotify.setImageViewResource(R.id.NOTYFY_BTN,R.drawable.stop);

...

setImageViewResource不能将此行用于通知或任何其他样式更改方法。

唯一的办法就是创建服务,加上startCommand CREATE_NOTIFY()   从intent action name中查找要加载的notify.xml。   在通知构建并添加关闭服务之后,然后从广播呼叫:

  Intent serviceIntent = new Intent("WITHSTOP");

  serviceIntent.putExtra("WITHSTOP", "1");
  // must be MyApp extend Application reason : from broadcaster you cant access getContext and startService etc.              
  MyApp.getInstance().startService(serviceIntent);

看起来像:

public class MyApp extends Application {
    private static MyApp instance;

    public static MyApp getInstance() {
        return instance;
    }

    public static Context getContext(){
        return instance;
        // or return instance.getApplicationContext();
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }
}

...