Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom Notification with dynamic layout in remote view

I am creating custom notification with dynamic layout instead of xml layout in remote views but end up with following error.

03-12 14:42:59.907: E/AndroidRuntime(2399): android.app.RemoteServiceException: Bad notification posted from package com.example.notificationexample: Couldn't expand RemoteViews for: StatusBarNotification(pkg=com.example.notificationexample id=0 tag=null score=0 notn=Notification(pri=0 contentView=com.example.notificationexample/0x1e vibrate=null sound=null defaults=0x0 flags=0x10 kind=[null]))
03-12 14:42:59.907: E/AndroidRuntime(2399):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1370)
03-12 14:42:59.907: E/AndroidRuntime(2399):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 14:42:59.907: E/AndroidRuntime(2399):     at android.os.Looper.loop(Looper.java:137)
03-12 14:42:59.907: E/AndroidRuntime(2399):     at android.app.ActivityThread.main(ActivityThread.java:4905)
03-12 14:42:59.907: E/AndroidRuntime(2399):     at java.lang.reflect.Method.invokeNative(Native Method)
03-12 14:42:59.907: E/AndroidRuntime(2399):     at java.lang.reflect.Method.invoke(Method.java:511)
03-12 14:42:59.907: E/AndroidRuntime(2399):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)

I have seen many questions with almost same problem but they are using xml in layout. I am using dynamic layout. Here is my code:

public void CustomNotification() {


        //creating Custom Layout
        RelativeLayout parent_layout=new RelativeLayout(this);
        RelativeLayout.LayoutParams rlparent = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT);

        parent_layout.setLayoutParams(rlparent);
        parent_layout.setBackgroundColor(Color.WHITE);
        parent_layout.setId(30);

        //creating image
        ImageView iv=new ImageView(this);
        RelativeLayout.LayoutParams rl_iv=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        iv.setId(31);
        iv.setImageResource(R.drawable.androidhappy);
        iv.setLayoutParams(rl_iv);
        parent_layout.addView(iv);

        //creataing text view "title"

         TextView title = new TextView(this);
         RelativeLayout.LayoutParams title_Param = new RelativeLayout.LayoutParams(
                      RelativeLayout.LayoutParams.WRAP_CONTENT,
                      RelativeLayout.LayoutParams.WRAP_CONTENT);
         title_Param.addRule(RelativeLayout.RIGHT_OF,iv.getId());
         title_Param.addRule(RelativeLayout.ALIGN_LEFT);
        // title.setText("Title");
         title.setEllipsize(TextUtils.TruncateAt.END);
         title.setPadding(6, 5, 0, 0);
         title.setSingleLine(true);
         title.setTextColor(Color.BLACK);
         title.setTextSize(12);
        title.setText("Good Morning");
         title.setId(11);
          title.setLayoutParams(title_Param);
         parent_layout.addView(title);


        // Using RemoteViews to bind custom layouts into Notification
        RemoteViews remoteViews = new RemoteViews(this.getPackageName(),parent_layout.getId());
      //    RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.orignal_customnotification);

        // Set Notification Title
        String strtitle = getString(R.string.customnotificationtitle);
        // Set Notification Text
        String strtext = getString(R.string.customnotificationtext);

        // Open NotificationView Class on Notification Click
        Intent intent = new Intent(this, NotificationView.class);
        // Send data to NotificationView Class
        intent.putExtra("title", strtitle);
        intent.putExtra("text", strtext);
        // Open NotificationView.java Activity
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                this)
        // Set Icon
                .setSmallIcon(R.drawable.logosmall)
                // Set Ticker Message
                .setTicker("My Ticker text...")
                // Dismiss Notification
                .setAutoCancel(true)
                // Set PendingIntent into Notification
                .setContentIntent(pIntent)
                // Set RemoteViews into Notification
                .setContent(remoteViews);


        remoteViews.setImageViewResource(iv.getId(),R.drawable.androidhappy);
        remoteViews.setTextViewText(title.getId(), "Good Morning..");


// Create Notification Manager
        NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        // Build Notification with Notification Manager
        notificationmanager.notify(0, builder.build());


    }
like image 223
Kapil Avatar asked Nov 10 '22 11:11

Kapil


1 Answers

What you want to do is not possible; live View objects cannot be used with notifications; RemoteViews is the only type supported for Notification.contentView. If you look at the API docs you can see that the only way to create one is by referencing a layout xml file, although once you have one you can modify it in lots of different ways, including adding other RemoteViews to the layout.

like image 194
dsandler Avatar answered Nov 14 '22 23:11

dsandler