protected override void OnElementChanged(ElementChangedEventArgs <Page> e)
        {
            base.OnElementChanged(e);

            if (_view == null)
            {
                var activity = Context as Activity;
                _view = activity.LayoutInflater.Inflate(Resource.Layout.EnergyLayout, this, false);

                AddView(_view);

                _scanView = _view.FindViewById <EnergyScanView>(Resource.Id.energy_scan_view);
                _scanView.InitAnyline(LicenseKey, this);

                // In this example, the config is set via EnergyLayout.axml instead of the json file to demonstrate both ways.
                // See: https://documentation.anyline.io/toc/platforms/android/view_configuration.html

                // To load the json config instead of the axml config, uncomment the following line:
                //_scanView.SetConfigFromAsset("EnergyConfig.json");

                // The config can be changed via code directly through the Config property, for example:
                var config = _scanView.Config;
                config.SetFlashMode(AnylineViewConfig.FlashMode.Auto);
                _scanView.Config.SetFlashAlignment(AnylineViewConfig.FlashAlignment.TopRight);

                // Important: Once the config is changed, it has to be set again explicitly:
                _scanView.Config = config;

                _scanView.SetScanMode(EnergyScanView.ScanMode.AnalogMeter);
                _scanView.SetCancelOnResult(false);

                _scanView.StartScanning();
            }
        }
        protected override void OnCreate(Bundle bundle)
        {
            Window.SetFlags(WindowManagerFlags.KeepScreenOn, WindowManagerFlags.KeepScreenOn);

            base.OnCreate(bundle);
            SetContentView(Resource.Layout.EnergyActivity);

            _scanView = FindViewById <EnergyScanView>(Resource.Id.energy_scan_view);

            _energyUseCase = Intent.Extras.GetSerializable("OBJECT").ToString();

            _scanView.SetConfigFromAsset(_energyUseCase.Equals(Resources.GetString(Resource.String.scan_heat_meter))
                ? "EnergyConfigHeatMeter.json"
                : "EnergyConfigAll.json");

            _scanView.InitAnyline(MainActivity.LicenseKey, this);
            _scanView.SetScanMode(EnergyScanView.ScanMode.ElectricMeter);

            //in our main activity, we selected which type of meters we want to scan
            //now we want to populate the radiobutton group accordingly:

            RadioGroup radioGroup   = FindViewById <RadioGroup>(Resource.Id.radio_group);
            int        defaultIndex = 0; //index for which radiobutton is checked at the beginning

            if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_analog_electric_meter)))
            {
                _scanList = new Dictionary <string, EnergyScanView.ScanMode>
                {
                    { Resources.GetString(Resource.String.electric_meter), EnergyScanView.ScanMode.ElectricMeter },
                    { Resources.GetString(Resource.String.electric_meter_5), EnergyScanView.ScanMode.ElectricMeter51 },
                    { Resources.GetString(Resource.String.electric_meter_6), EnergyScanView.ScanMode.ElectricMeter61 },
                    { Resources.GetString(Resource.String.analog_meter_white), EnergyScanView.ScanMode.AnalogMeterWhite },
                    { Resources.GetString(Resource.String.analog_meter_7), EnergyScanView.ScanMode.AnalogMeter7 }
                };

                _scanView.SetScanMode(_scanList.First().Value);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_analog_gas_meter)))
            {
                _scanList = new Dictionary <string, EnergyScanView.ScanMode>
                {
                    { Resources.GetString(Resource.String.gas_4), EnergyScanView.ScanMode.AnalogMeter4 },
                    { Resources.GetString(Resource.String.gas_5), EnergyScanView.ScanMode.GasMeter },
                    { Resources.GetString(Resource.String.gas_6), EnergyScanView.ScanMode.GasMeter6 },
                    { Resources.GetString(Resource.String.gas_7), EnergyScanView.ScanMode.AnalogMeter7 }
                };

                defaultIndex = 1;
                _scanView.SetScanMode(_scanList.ElementAt(defaultIndex).Value);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_analog_water_meter)))
            {
                _scanList = new Dictionary <string, EnergyScanView.ScanMode>
                {
                    { Resources.GetString(Resource.String.water_white), EnergyScanView.ScanMode.WaterMeterWhite },
                    { Resources.GetString(Resource.String.water_black), EnergyScanView.ScanMode.WaterMeterBlack }
                };

                _scanView.SetScanMode(_scanList.First().Value);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_digital_meter)))
            {
                _scanView.SetScanMode(EnergyScanView.ScanMode.DigitalMeter);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_heat_meter)))
            {
                _scanList = new Dictionary <string, EnergyScanView.ScanMode>
                {
                    { Resources.GetString(Resource.String.heat_meter_4_3), EnergyScanView.ScanMode.HeatMeter4 },
                    { Resources.GetString(Resource.String.heat_meter_5_3), EnergyScanView.ScanMode.HeatMeter5 },
                    { Resources.GetString(Resource.String.heat_meter_6_3), EnergyScanView.ScanMode.HeatMeter6 }
                };

                _scanView.SetScanMode(_scanList.First().Value);
            }

            Util.PopulateRadioGroupWithList(this, radioGroup, _scanList, defaultIndex);

            // switch the scan mode depending on user selection
            radioGroup.CheckedChange += (sender, args) =>
            {
                _scanView.CancelScanning();

                var rb       = FindViewById <RadioButton>(args.CheckedId);
                var scanMode = _scanList.Single(x => x.Key.Equals(rb.Text)).Value;

                _scanView.SetScanMode(scanMode);
                _scanView.StartScanning();
            };

            _scanView.CameraOpened += (s, e) => { Log.Debug(TAG, "Camera opened successfully. Frame resolution " + e.Width + " x " + e.Height); };
            _scanView.CameraError  += (s, e) => { Log.Error(TAG, "OnCameraError: " + e.Event.Message); };

            _scanView.SetCancelOnResult(false);
        }
        protected override void OnCreate(Bundle bundle)
        {
            Window.SetFlags(WindowManagerFlags.KeepScreenOn, WindowManagerFlags.KeepScreenOn);

            base.OnCreate(bundle);

            ActionBar.SetHomeButtonEnabled(true);
            ActionBar.SetDisplayHomeAsUpEnabled(true);

            SetContentView(Resource.Layout.EnergyActivity);

            _scanView = FindViewById <EnergyScanView>(Resource.Id.energy_scan_view);

            _energyUseCase = Intent.Extras.GetSerializable("OBJECT").ToString();
            _scanView.SetConfigFromAsset(_energyUseCase.Equals(Resources.GetString(Resource.String.scan_heat_meter))
                ? "EnergyConfigHeatMeter.json"
                : "EnergyConfigAll.json");

            _scanView.InitAnyline(MainActivity.LicenseKey, this);

            NativeBarcodeResultTextView      = FindViewById <TextView>(Resource.Id.barcode_result_text);
            NativeBarcodeResultTextView.Text = "";

            _toggleBarcodeSwitch = FindViewById <Switch>(Resource.Id.toggle_barcode_switch);

            // we don't use the native barcode scan mode in heat meters in this example
            if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_heat_meter)))
            {
                var toggleBarcodeLayout = FindViewById <RelativeLayout>(Resource.Id.toggle_barcode_layout);
                toggleBarcodeLayout.Visibility = ViewStates.Gone;
            }
            else
            {
                _toggleBarcodeSwitch.CheckedChange += (sender, args) =>
                {
                    if (((Switch)sender).Checked)
                    {
                        /*
                         * Enable simultaneous barcode scanning:
                         *
                         * The following lines of code enable the simultaneous barcode scanning functionality.
                         * In order for this to work, some additional requires must be met in the project settings:
                         *
                         * In AndroidManifest.xml, the following must be added:
                         * <meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode" />
                         *
                         * Also, the Nuget Package "Xamarin.GooglePlayServices.Vision" must be installed for this application.
                         * For installation, the App must be targeted to Android 7.0, but then the SDK version can be reduced again.
                         */
                        try
                        {
                            // First, we check if the barcode detector works on the device
                            var detector = new BarcodeDetector.Builder(ApplicationContext).Build();
                            if (!detector.IsOperational)
                            {
                                // Native barcode scanning not supported on this device
                                Toast.MakeText(ApplicationContext, "Native Barcode scanning not supported on this device!", ToastLength.Long).Show();
                                _toggleBarcodeSwitch.Checked = false;
                            }
                            else
                            {
                                _nativeBarcodeResultListener?.Dispose(); // dispose of old barcodelistener first
                                _nativeBarcodeResultListener = new NativeBarcodeResultListener(this);
                                _scanView.EnableBarcodeDetection(true, _nativeBarcodeResultListener);
                            }
                        }
                        catch (Exception) { }
                    }
                    else
                    {
                        _scanView.DisableBarcodeDetection();
                        _nativeBarcodeResultListener?.Dispose();
                        NativeBarcodeResultTextView.Text = "";
                    }
                };
            }

            // In our main activity, we selected which type of meters we want to scan
            // Now we want to populate the RadioButton group accordingly:

            RadioGroup radioGroup   = FindViewById <RadioGroup>(Resource.Id.radio_group);
            int        defaultIndex = 0; //index for which radiobutton is checked at the beginning

            if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_analog_meter)))
            {
                SetTitle(Resource.String.scan_analog_meter);
                _scanView.SetScanMode(EnergyScanView.ScanMode.AnalogMeter);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_digital_meter)))
            {
                SetTitle(Resource.String.scan_digital_meter);
                _scanView.SetScanMode(EnergyScanView.ScanMode.DigitalMeter);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_heat_meter)))
            {
                SetTitle(Resource.String.scan_heat_meter);
                _scanList = new Dictionary <string, EnergyScanView.ScanMode>
                {
                    { Resources.GetString(Resource.String.heat_meter_4_3), EnergyScanView.ScanMode.HeatMeter4 },
                    { Resources.GetString(Resource.String.heat_meter_5_3), EnergyScanView.ScanMode.HeatMeter5 },
                    { Resources.GetString(Resource.String.heat_meter_6_3), EnergyScanView.ScanMode.HeatMeter6 }
                };

                _scanView.SetScanMode(_scanList.First().Value);

                // Adding an additional layout rule for this use case because of the radiobutton group size.
                var lp = NativeBarcodeResultTextView.LayoutParameters as RelativeLayout.LayoutParams;
                if (lp != null)
                {
                    lp.AddRule(LayoutRules.Above, radioGroup.Id);
                    NativeBarcodeResultTextView.LayoutParameters = lp;
                }
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_analog_digital_meter)))
            {
                SetTitle(Resource.String.scan_analog_digital_meter);
                _scanView.SetScanMode(EnergyScanView.ScanMode.AutoAnalogDigitalMeter);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_serial_numbers)))
            {
                SetTitle(Resource.String.scan_serial_numbers);
                _scanView.SetScanMode(EnergyScanView.ScanMode.SerialNumber);

                // we can set the regex and character whitelist to improve SerialNumber scanning
                _scanView.SetSerialNumberCharWhitelist("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
                _scanView.SetSerialNumberValidationRegex("^[0-9A-Z]{5,}$");
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_dial_meters)))
            {
                SetTitle(Resource.String.scan_dial_meters);
                _scanView.SetScanMode(EnergyScanView.ScanMode.DialMeter);
            }
            else if (_energyUseCase.Equals(Resources.GetString(Resource.String.scan_dot_matrix_meters)))
            {
                SetTitle(Resource.String.scan_dot_matrix_meters);
                _scanView.SetScanMode(EnergyScanView.ScanMode.DotMatrixMeter);
            }
            Util.PopulateRadioGroupWithList(this, radioGroup, _scanList, defaultIndex);

            // Switch the scan mode depending on user selection

            radioGroup.CheckedChange += (sender, args) =>
            {
                _scanView.CancelScanning();

                var rb       = FindViewById <RadioButton>(args.CheckedId);
                var scanMode = _scanList.Single(x => x.Key.Equals(rb.Text)).Value;

                _scanView.SetScanMode(scanMode);
                _scanView.StartScanning();
            };

            _scanView.CameraOpened += (s, e) => { Log.Debug(TAG, "Camera opened successfully. Frame resolution " + e.Width + " x " + e.Height); };
            _scanView.CameraError  += (s, e) => { Log.Error(TAG, "OnCameraError: " + e.Event.Message); };

            _scanView.SetCancelOnResult(false);
        }