We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. (Last updated on: June 24, 2019).
Unfortunately, activation email could not send to your email. Please try again.
Syncfusion Feedback

Using a SfChart in an Android widget

Thread ID:

Created:

Updated:

Platform:

Replies:

143929 Apr 10,2019 08:34 PM UTC Oct 29,2020 03:57 PM UTC Xamarin.Android 14
loading
Tags: SfChart
Bardi Golriz
Asked On April 10, 2019 08:34 PM UTC

This is a straightforward query: is it possible to have a SfChart embedded in an Android widget? I ask because when I include a SfChart, the widget is unable to load. And if it is possible, are there any specific steps that need to be taken in order to allow for it?



Devakumar Dhanapoosanam [Syncfusion]
Replied On April 17, 2019 03:39 AM UTC

Hi Bardi, 
 
Greetings from Syncfusion. We are analyzing the feasibility of adding the SfChart in the android widget and will update you the status on April 17th, 2019. 
 
Thanks, 
Devakumar 


Bharathiraja K [Syncfusion]
Replied On April 17, 2019 12:04 PM UTC

Hi Bardi, 
  
The AppWidget Layout is a one of the RemoteViews, which does not support every kind of layout or views. It had some restriction. We cannot add the Custom views in the AppWidget layout.  
  
  
We are trying to find any other feasible solution for this, we will update you the status in two business days 23rd April 2019. 
  
Regards, 
Bharathi. 


Bharathiraja K [Syncfusion]
Replied On April 23, 2019 12:52 PM UTC

Hi Bardi, 
 
There is no direct approach to add custom layout as android widget 
 
Reference link: 
 
Maybe we can try to add custom layout as image by below link.  
 
Regards, 
Bharathi. 


Bardi Golriz
Replied On October 2, 2020 09:49 AM UTC

Hi Bardi, 
 
There is no direct approach to add custom layout as android widget 
 
Reference link: 
 
Maybe we can try to add custom layout as image by below link.  
 
Regards, 
Bharathi. 


Hi there,

Bringing this back up again.

I'm following the advice provided to create a bitmap of the chart and display that instead. However, this doesn't seem to work. I hope you are able to figure a workaround, as perhaps there is something I may have missed in my implementation.

So, I create an object that will instantiate a SfChart within, available as a field "chart":

                    var data = new Hour_Range(Application.Context);
                    Bitmap bitmap = getBitmapFromView(data.chart);
                    widgetView.SetImageViewBitmap(Resource.Id.chart, bitmap);

The getBitmapFromView function gets passed in a view and returns it as a bitmap (from https://stackoverflow.com/questions/52642055/view-getdrawingcache-is-deprecated-in-android-api-28 – the link you shared last consisted of a deprecated method to achieve the same, which didn't work either):

        public Bitmap getBitmapFromView(View view)
        {
            Bitmap bitmap = Bitmap.CreateBitmap(view.Width, view.Height, Bitmap.Config.Argb8888);
            Canvas canvas = new Canvas(bitmap);
            view.Draw(canvas);
            return bitmap;
        }
This however runs into an exception:

{Java.Lang.IllegalArgumentException: width and height must be > 0
  at Java.Interop.JniEnvironment+StaticMethods.CallStaticObjectMethod (Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in <…}
Debugging clarifies that the width and height of data.chart SfChart is still 0 at the time the bitmap is trying to be created. 

I've tried explicitly setting the width and height:

                    data.chart.Measure(400, 400);
                    data.chart.Layout(0, 0, 400,400);

As well as:

Bitmap bitmap = Bitmap.CreateBitmap(400,400, Bitmap.Config.Argb8888);

Although this means no exception occurs, nothing gets drawn.

To be clear, I know the chart itself has been setup fine because it's using the same code that creates charts in-app which display absolutely fine.

Any ideas?

Bardi Golriz
Replied On October 2, 2020 10:30 AM UTC

Okay, I have a positive update but there are still issues.

If I do the following:

chart.Measure(View.MeasureSpec.MakeMeasureSpec(400, MeasureSpecMode.Exactly), View.MeasureSpec.MakeMeasureSpec(400, MeasureSpecMode.Exactly));
chart.Layout(0, 0, 400,400);

And then:

Bitmap bitmap = Bitmap.CreateBitmap(400,400, Bitmap.Config.Argb8888);
Canvas canvas = new Canvas(bitmap);
chart.Draw(canvas);

This does show the chart on the widget! However, it's not displaying the chart annotations (which are essential).

This is what it looks like:



It should look like this, which it does in-app, running the same exact code (ignore the values being different):



See attached for screenshots

The annotation for reference is as follows:

ViewAnnotation annotation = new ViewAnnotation()
{
    X1 = x,
    Y1 = y,
    VerticalAlignment = ChartAnnotationAlignment.Center,
};

// icon
AppCompatImageView iconImage = new AppCompatImageView(context);
iconImage.SetImageResource(Convertor_Icon_Droid.parseXS(icon));

// value
TextView textView = new TextView(context);
textView.Text = value;
Helper_Text.SetFont_ChartValue(textView);
textView.TextSize = 12;
textView.TextAlignment = Android.Views.TextAlignment.Center;
textView.Gravity = Android.Views.GravityFlags.CenterHorizontal;
textView.SetPadding(0, 8, 0, 0);
textView.SetTextColor(Convertor_Colour_Droid.convert(Helper_Colour_Droid.GetText()));


// container
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.Orientation = Orientation.Vertical;
linearLayout.SetPadding(5,5,5,5);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WrapContent, LinearLayout.LayoutParams.WrapContent);
linearLayout.SetBackgroundColor(background); 
layoutParams.SetMargins(0, 0, 0, 0);
linearLayout.LayoutParameters = layoutParams;

linearLayout.AddView(iconImage);
linearLayout.AddView(textView);

annotation.View = linearLayout
chart.Annotations.Add(annotation)

Attachment: Archive_abdc68fc.zip

Saravanan Madheswaran [Syncfusion]
Replied On October 5, 2020 11:47 AM UTC

Hi Bardi, 
 
Based on the provided code snippet, we understand that you are converted the chart as a bitmap to export it into a widget. Then we are suspecting it will be resolved by creating a bitmap from the chart drawing cache.    
 
. . . 
chart.DrawingCacheEnabled = true; 
. . . 
Android.Graphics.Bitmap bitmap = null; 
using (bitmap = chart.DrawingCache) 
{ 
. . . 
try 
{ 
    //Update bitmap to widget 
} 
} 
finally 
{ 
    chart.DrawingCacheEnabled = false; 
} 
. . . 
} 
 
 
Note: Due to facing some unhandled exceptions, we were unable to check this solution in sample. 
 
Please check this and let us know with more details of either issue reproducing sample or else more details in case of misunderstanding.  
 
Regards, 
Saravanan.  


Bardi Golriz
Replied On October 22, 2020 10:21 AM UTC

I've tried a couple of things but no luck unfortunately.

Firstly:

    var chartBuilder = new Chart_Range_Hour_Droid(Application.Context, range); // sets up builder
    chartBuilder._chart.DrawingCacheEnabled = true; 
    chartBuilder.build(); // builds chart i.e. axis and line w/ annotation
    chart._chart.Measure(View.MeasureSpec.MakeMeasureSpec(400, MeasureSpecMode.Exactly), View.MeasureSpec.MakeMeasureSpec(400, MeasureSpecMode.Exactly));
    chart._chart.Layout(0, 0, 400, 400);
    Android.Graphics.Bitmap bitmap = null;

    using (bitmap = chart._chart.DrawingCache)
    { 
        try
        {
            widgetView.SetImageViewBitmap(Resource.Id.chart, bitmap);
        }
        finally
        {
            chart._chart.DrawingCacheEnabled = false;
        }
    }

This actually doesn't draw anything. Perhaps I misunderstood the instructions?

Also:

    using (bitmap = chart._chart.DrawingCache)
    { 
        try
        {
            bitmap = Helper_Widget.getBitmapFromView(chart._chart);
            widgetView.SetImageViewBitmap(Resource.Id.chart, bitmap);
        }
        finally
        {
            chart._chart.DrawingCacheEnabled = false;
        }
    }

Draws the chart just like before i.e. the line and x-axis labels, but not the annotations.

For reference, this is the chart control I'm updating the bitmap of:

<!-- Chart -->
<LinearLayout
android:id="@+id/data"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
android:layout_below="@+id/summary">
<ImageView
   android:id="@+id/chart"
   android:layout_width="match_parent"
   android:layout_height="match_parent"/>
</LinearLayout>

Saravanan Madheswaran [Syncfusion]
Replied On October 23, 2020 04:09 PM UTC

Hi Bardi,    
  
We have validated provided code snippet and we feel it will be better to share your application/mock project to test at our end with the provided suggestion to achieve the solution in better and possible ways at earlier. 
 
Regards, 
Saravanan. 


Bardi Golriz
Replied On October 23, 2020 04:11 PM UTC

Okay, I will do that next week. Thanks for testing, and your continued support.

Bardi Golriz
Replied On October 24, 2020 08:15 PM UTC

See attached for a sample project. No matter what I try the DrawingCache seems to be null. I'm perhaps missing something obvious! Although the chart is rough, it is visible when you load the app i.e. there's nothing wrong with the chart itself, but a problem with getting it to draw on the widget.

You'll need to look at Widget.cs and Widget.axml.

Thanks for your support!

Attachment: playground_d20c748d.zip

Saravanan Madheswaran [Syncfusion]
Replied On October 26, 2020 12:26 PM UTC

Hi Bardi,  
  
Thanks for providing sample, we will validate and update you the complete status on or before 28th October 2020. We will appreciate your patience until then.   
  
Regards,  
Saravanan.   


Saravanan Madheswaran [Syncfusion]
Replied On October 28, 2020 11:21 AM UTC

Hi Bardi, 
 
Thanks for your patience.  
  
We would like to let you know that without rendering the chart in UI, we were unable to properly convert that as a bitmap. Hence achieved it by already rendered chart instance and convert as a bitmap as per in below  
   
Please check the code snippet and sample below. we hope this approach will resolve your issue.    
 
Android.Graphics.Bitmap bitmap = null
 
MainActivity._chart.DrawingCacheEnabled = true
 
using (bitmap = MainActivity._chart.DrawingCache
    try 
   
        //bitmap = getBitmapFromView(_chart); 
        widgetView.SetImageViewBitmap(playground.Droid.Resource.Id.chart, bitmap); 
   
. . . 
 
 
 
Regards, 
saravanan.

Bardi Golriz
Replied On October 28, 2020 02:07 PM UTC

Thanks for getting back.

So, my first reaction (and after a quick test) is that this seems to work if the app was running in the background (i.e. MainActivity was setup previously in the foreground, and so there's a chart that can be referenced), but how do you deal in a scenario when the app is not suspended in the background (i.e. there's no MainActivity that can be referenced)?

Yuvaraj Palanisamy [Syncfusion]
Replied On October 29, 2020 03:57 PM UTC

Hi Bardi, 
 
Currently we are trying to achieve the possible workaround for your requirement and we will update you the complete details on or before 30th October 2020. 
  
Regards, 
Yuvaraj

CONFIRMATION

This post will be permanently deleted. Are you sure you want to continue?

Sorry, An error occured while processing your request. Please try again later.

Please sign in to access our forum

This page will automatically be redirected to the sign-in page in 10 seconds.

Warning Icon You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.Close Icon

Live Chat Icon For mobile
Live Chat Icon