Xamarin app is running fine in every physical & Virtual device we have access to without any crash. But our client has an android device: "CAT s48c" , in which whenever he is clicking on CustomEntry field,the whole app crashes. below is the crash report from App Center:
md51558244f76c53b6aeda52c8a337f2c37.ViewRenderer_2.onLayout ViewRenderer_2.java, line 47
JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args)
JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters)
View.Layout (System.Int32 l, System.Int32 t, System.Int32 r, System.Int32 b)
ViewRenderer`2[TView,TNativeView].OnLayout (System.Boolean changed, System.Int32 l, System.Int32 t, System.Int32 r, System.Int32 b)
FormsViewGroup.n_OnLayout_ZIIII (System.IntPtr jnienv, System.IntPtr native__this, System.Boolean p0, System.Int32 p1, System.Int32 p2, System.Int32 p3, System.Int32 p4)
(wrapper dynamic-method) System.Object.32(intptr,intptr,bool,int,int,int,int)
java.lang.NullPointerException: activityToken
android.os.Parcel.readException Parcel.java:2019
android.os.Parcel.readException Parcel.java:1959
android.view.autofill.IAutoFillManager$Stub$Proxy.startSession IAutoFillManager.java:397
android.view.autofill.AutofillManager.startSessionLocked AutofillManager.java:1012
android.view.autofill.AutofillManager.notifyViewEntered AutofillManager.java:604
android.view.autofill.AutofillManager.notifyViewEntered AutofillManager.java:575
android.view.View.notifyEnterOrExitForAutoFillIfNeeded View.java:6980
android.view.View.layout View.java:19691
md51558244f76c53b6aeda52c8a337f2c37.ViewRenderer_2.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.ViewRenderer_2.onLayout ViewRenderer_2.java:47
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.ScrollViewContainer.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.ScrollViewContainer.onLayout ScrollViewContainer.java:46
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.widget.FrameLayout.layoutChildren FrameLayout.java:323
android.widget.FrameLayout.onLayout FrameLayout.java:261
android.support.v4.widget.NestedScrollView.onLayout NestedScrollView.java:1733
md51558244f76c53b6aeda52c8a337f2c37.ScrollViewRenderer.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.ScrollViewRenderer.onLayout ScrollViewRenderer.java:91
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md5f92e0daf340890c9667469657ee2ece8.FrameRenderer.n_onLayout(Native Method)
md5f92e0daf340890c9667469657ee2ece8.FrameRenderer.onLayout FrameRenderer.java:46
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
md5f92e0daf340890c9667469657ee2ece8.FrameRenderer.n_onLayout(Native Method)
md5f92e0daf340890c9667469657ee2ece8.FrameRenderer.onLayout FrameRenderer.java:46
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.VisualElementRenderer_1.onLayout VisualElementRenderer_1.java:81
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.PageRenderer.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.PageRenderer.onLayout PageRenderer.java:72
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md58432a647068b097f9637064b8985a5e0.NavigationPageRenderer.n_onLayout(Native Method)
md58432a647068b097f9637064b8985a5e0.NavigationPageRenderer.onLayout NavigationPageRenderer.java:65
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md58432a647068b097f9637064b8985a5e0.MasterDetailContainer.n_onLayout(Native Method)
md58432a647068b097f9637064b8985a5e0.MasterDetailContainer.onLayout MasterDetailContainer.java:46
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.support.v4.widget.DrawerLayout.onLayout DrawerLayout.java:1231
md58432a647068b097f9637064b8985a5e0.MasterDetailPageRenderer.n_onLayout(Native Method)
md58432a647068b097f9637064b8985a5e0.MasterDetailPageRenderer.onLayout MasterDetailPageRenderer.java:68
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
md58432a647068b097f9637064b8985a5e0.NavigationPageRenderer.n_onLayout(Native Method)
md58432a647068b097f9637064b8985a5e0.NavigationPageRenderer.onLayout NavigationPageRenderer.java:65
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout FormsViewGroup.java:37
md51558244f76c53b6aeda52c8a337f2c37.PlatformRenderer.n_onLayout(Native Method)
md51558244f76c53b6aeda52c8a337f2c37.PlatformRenderer.onLayout PlatformRenderer.java:55
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.widget.RelativeLayout.onLayout RelativeLayout.java:1083
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.widget.FrameLayout.layoutChildren FrameLayout.java:323
android.widget.FrameLayout.onLayout FrameLayout.java:261
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.widget.FrameLayout.layoutChildren FrameLayout.java:323
android.widget.FrameLayout.onLayout FrameLayout.java:261
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.widget.FrameLayout.layoutChildren FrameLayout.java:323
android.widget.FrameLayout.onLayout FrameLayout.java:261
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.widget.LinearLayout.setChildFrame LinearLayout.java:1791
android.widget.LinearLayout.layoutVertical LinearLayout.java:1635
android.widget.LinearLayout.onLayout LinearLayout.java:1544
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.widget.FrameLayout.layoutChildren FrameLayout.java:323
android.widget.FrameLayout.onLayout FrameLayout.java:261
com.android.internal.policy.DecorView.onLayout DecorView.java:761
android.view.View.layout View.java:19663
android.view.ViewGroup.layout ViewGroup.java:6075
android.view.ViewRootImpl.performLayout ViewRootImpl.java:2500
android.view.ViewRootImpl.performTraversals ViewRootImpl.java:2216
android.view.ViewRootImpl.doTraversal ViewRootImpl.java:1396
android.view.ViewRootImpl$TraversalRunnable.run ViewRootImpl.java:6773
android.view.Choreographer$CallbackRecord.run Choreographer.java:966
android.view.Choreographer.doCallbacks Choreographer.java:778
android.view.Choreographer.doFrame Choreographer.java:713
android.view.Choreographer$FrameDisplayEventReceiver.run Choreographer.java:952
android.os.Handler.handleCallback Handler.java:790
android.os.Handler.dispatchMessage Handler.java:99
android.os.Looper.loop Looper.java:164
android.app.ActivityThread.main ActivityThread.java:6529
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run RuntimeInit.java:438
com.android.internal.os.ZygoteInit.main ZygoteInit.java:807
The Custom Entry i'm using for Android:
In CommonCode:
namespace InventoryPPG.CustomRenderers
{
public class CustomEntry : Entry
{
#region lookup
//** - Setting BackgroundColor with cornerradius entry fields shows the color outside of borders too in Andorid.To avoid that, used CustomBackgrondColor
#endregion
public static readonly BindableProperty ImageProperty =
BindableProperty.Create(nameof(Image), typeof(string), typeof(CustomEntry), string.Empty);
public static readonly BindableProperty ImageAlignmentProperty =
BindableProperty.Create(nameof(ImageAlignment), typeof(ImageAlignment), typeof(CustomEntry), ImageAlignment.Right);
public static readonly BindableProperty HasImageProperty =
BindableProperty.Create(nameof(HasImage), typeof(bool), typeof(CustomEntry), false);
public static readonly BindableProperty CustomBackgroundColorProperty =
BindableProperty.Create(nameof(CustomBackgroundColor), typeof(Color), typeof(CustomEntry)); // lookup - **
public static readonly BindableProperty CornerRadiusProperty =
BindableProperty.Create(nameof(CornerRadius), typeof(Thickness), typeof(CustomEntry), null);
public static readonly BindableProperty MaxCapProperty =
BindableProperty.Create(nameof(MaxCap), typeof(int), typeof(CustomEntry), null);
public Color CustomBackgroundColor
{
get { return (Color)GetValue(CustomBackgroundColorProperty); }
set { SetValue(CustomBackgroundColorProperty, value); }
}
public bool HasImage
{
get { return (bool)GetValue(HasImageProperty); }
set { SetValue(HasImageProperty, value); }
}
public string Image
{
get { return (string)GetValue(ImageProperty); }
set { SetValue(ImageProperty, value); }
}
public ImageAlignment ImageAlignment
{
get { return (ImageAlignment)GetValue(ImageAlignmentProperty); }
set { SetValue(ImageAlignmentProperty, value); }
}
public Thickness CornerRadius
{
get { return (Thickness)GetValue(CornerRadiusProperty); }
set { SetValue(CornerRadiusProperty, value); }
}
public int MaxCap
{
get { return (int)GetValue(MaxCapProperty); }
set { SetValue(MaxCapProperty, value); }
}
}
public enum ImageAlignment
{
Left, Right
}
}
In Android:
[assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
namespace InventoryPPG.Droid.Renderers
{
public class CustomEntryRenderer : EntryRenderer
{
CustomEntry view;
int paddingValue = 10;
GradientDrawable _gradientBackground;
public CustomEntryRenderer(Context context) : base(context) { }
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
try
{
if (this.Element == null || this.Control == null || _gradientBackground == null) return;
if (e.PropertyName == nameof(view.CustomBackgroundColor))
{
_gradientBackground.SetColor(view.CustomBackgroundColor.ToAndroid());
}
}catch(Exception ex) {
GlobalVar.ConsoleError(ex,nameof(CustomEntryRenderer), "OnElementPropertyChanged");
}
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
try
{
if (e.NewElement != null)
{
view = (CustomEntry)Element;
Color borderColor = (Color)Xamarin.Forms.Application.Current.Resources["GrayBorderColor"];
_gradientBackground = new GradientDrawable();
_gradientBackground.SetShape(ShapeType.Rectangle);
_gradientBackground.SetColor(view.CustomBackgroundColor.ToAndroid());
SetCornerRadius(_gradientBackground);
_gradientBackground.SetStroke(3, borderColor.ToAndroid());
if (view.HeightRequest <= 0) view.HeightRequest = 34;
Control.SetBackground(_gradientBackground);
Control.Gravity = GravityFlags.CenterVertical;
if (view.HasImage)
{
switch (view.ImageAlignment)
{
case ImageAlignment.Left:
Control.SetPadding(130, 0, (int)DpToPixels(this.Context, Convert.ToSingle(paddingValue)), 0);
break;
case ImageAlignment.Right:
Control.SetPadding((int)DpToPixels(this.Context, Convert.ToSingle(paddingValue)), 0, 130, 0);
break;
}
}
else
{
Control.SetPadding((int)DpToPixels(this.Context, Convert.ToSingle(paddingValue)), 0, (int)DpToPixels(this.Context, Convert.ToSingle(paddingValue)), 0);
}
}
}
catch(Exception ex)
{
GlobalVar.ConsoleError(ex, nameof(CustomEntryRenderer), "OnElementChanged");
}
}
public void SetCornerRadius(GradientDrawable gd)
{
if (view.CornerRadius.HorizontalThickness != 0)
{
gd.SetCornerRadius((float)view.CornerRadius.HorizontalThickness);
if ((float)view.CornerRadius.HorizontalThickness > 15) paddingValue = 17;
}
else
{
gd.SetCornerRadius(14);
}
}
public static float DpToPixels(Context context, float valueInDp)
{
try
{
DisplayMetrics metrics = context.Resources.DisplayMetrics;
return TypedValue.ApplyDimension(ComplexUnitType.Dip, valueInDp, metrics);
}
catch(Exception ex)
{
GlobalVar.ConsoleError(ex, nameof(CustomEntryRenderer), "OnElementChanged");
return TypedValue.ApplyDimension(ComplexUnitType.Dip, valueInDp, null);
}
}
protected void SetFontSizeAgain()
{
try
{
var nativeControl = Control;
var ele = Element;
if (nativeControl != null && ele != null)
{
nativeControl.SetTextSize(Android.Util.ComplexUnitType.Dip, (float)Element.FontSize);
}
}
catch(Exception ex)
{
GlobalVar.ConsoleError(ex, nameof(CustomEntryRenderer), "OnElementChanged");
}
}
}
}
I've stopped all background APIs running but still getting the same issue. We are not doing anything else after clicking on entry field also, as per other suggestions in SO,applied below but nothing worked.
Control.ImeOptions = Android.Views.InputMethods.ImeAction.Done;
Control.ImportantForAutofill = ImportantForAutofill.No;