.DismissModalViewController closes all my pages. Why? - ios

I am using an image picker in my xamarin forms in order to pick an image from gallery to my program...
But, only in IOS device, when I close the image picker using
imagePicker.DismissModalViewController(true);
all my pop ups that is opened are closed with the imagePicker...
Does someone know why? or how I can solve that?
I am using DependencyService to do that in both
This is the code in IOS project
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Foundation;
using UIKit;
using neoFly_Montana.iOS;
using Xamarin.Forms;
using neoFly_Montana.Interface;
using System.Threading.Tasks;
using System.IO;
[assembly: Dependency(typeof(PicturePickerImplementation))]
namespace neoFly_Montana.iOS
{
public class PicturePickerImplementation : IPicturePicker
{
TaskCompletionSource<Stream> taskCompletionSource;
UIImagePickerController imagePicker;
public Task<Stream> GetImageStreamAsync()
{
// Create and define UIImagePickerController
imagePicker = new UIImagePickerController
{
SourceType = UIImagePickerControllerSourceType.PhotoLibrary,
MediaTypes = UIImagePickerController.AvailableMediaTypes(UIImagePickerControllerSourceType.PhotoLibrary)
};
// Set event handlers
imagePicker.FinishedPickingMedia += OnImagePickerFinishedPickingMedia;
imagePicker.Canceled += OnImagePickerCancelled;
// Present UIImagePickerController;
UIWindow window = UIApplication.SharedApplication.KeyWindow;
var viewController = window.RootViewController;
viewController.PresentModalViewController(imagePicker, true);
// Return Task object
taskCompletionSource = new TaskCompletionSource<Stream>();
return taskCompletionSource.Task;
}
void OnImagePickerFinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs args)
{
UIImage image = args.EditedImage ?? args.OriginalImage;
if (image != null)
{
// Convert UIImage to .NET Stream object
NSData data = image.AsJPEG(1);
Stream stream = data.AsStream();
// Set the Stream as the completion of the Task
taskCompletionSource.SetResult(stream);
}
else
{
taskCompletionSource.SetResult(null);
}
imagePicker.DismissModalViewController(true);
}
void OnImagePickerCancelled(object sender, EventArgs args)
{
taskCompletionSource.SetResult(null);
imagePicker.DismissModalViewController(true);
}
}
}
I am using RG.PLUGIN.POPUP

Related

Show ProgressBar programattically while user logging on

I found this class at Centering ProgressBar Programmatically in Android which would display a progressbar programmatically, problem is it's an Xamarin Android Studio example and I'm trying to convert it to Xamarin for Visual Studio 2017. This is the code that I have successfully converted with those lines that I can't seem to find a Xamarin VS 2017 equivalent for.
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace OML_Android
{
class ProgressBarHandler
{
private ProgressBar mProgressBar;
private Context mContext;
public ProgressBarHandler(Context context)
{
mContext = context;
ViewGroup layout = (ViewGroup)((Activity)context).FindViewById(Android.Resource.Id.Content).RootView;
mProgressBar = new ProgressBar(context, null, Android.Resource.Attribute.ProgressBarStyleLarge);
// there is no setIndeterminate method for progressbar
mProgressBar.setIndeterminate(true);
// I cannot find an equivilent for LayoutParams
RelativeLayout.LayoutParams params = RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MatchParent, RelativeLayout.LayoutParams.MatchParent);
RelativeLayout rl = new RelativeLayout(context);
// No equivalent for Gravity.CENTER
rl.SetGravity(Gravity.CENTER);
rl.AddView(mProgressBar);
layout.AddView(rl, params);
hide();
}
public void show()
{
mProgressBar.Visibility = Android.Views.ViewStates.Visible;
}
public void hide()
{
mProgressBar.Visibility = Android.Views.ViewStates.Invisible;
}
}
}
Once I have this converted and working I want it to overlay my logon view until the view finishes processing.
I help you transform Java code to C#, there is running GIF.
There is code.
class ProgressBarHandler
{
private ProgressBar mProgressBar;
private Context mContext;
public ProgressBarHandler(Context context)
{
mContext = context;
ViewGroup layout = (ViewGroup)((Activity)context).FindViewById(Android.Resource.Id.Content).RootView;
mProgressBar = new ProgressBar(context, null, Android.Resource.Attribute.ProgressBarStyleLarge);
// there is no setIndeterminate method for progressbar
// mProgressBar.SetIndeterminate(true);
mProgressBar.Indeterminate = true;
// I cannot find an equivilent for LayoutParams
RelativeLayout.LayoutParams layoutparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MatchParent, RelativeLayout.LayoutParams.MatchParent);
RelativeLayout rl = new RelativeLayout(context);
// No equivalent for Gravity.CENTER
rl.SetGravity(GravityFlags.Center );
rl.AddView(mProgressBar);
layout.AddView(rl, layoutparams);
hide();
}
public void show()
{
mProgressBar.Visibility = Android.Views.ViewStates.Visible;
}
public void hide()
{
mProgressBar.Visibility = Android.Views.ViewStates.Invisible;
}
}
You can use it directly like following code in Activity.
var progress= new ProgressBarHandler(this);
progress.show();

Can't create Xamarin Forms Picker custom rendere

Hi i easily created custom renderer for Forms Entry control, but when i tried to create one to Picker i get this error:
Error CS0115: `Punteam.iOS.PunteamPickerRederer.OnElementChanged(Xamarin.Forms.Platform.iOS.ElementChangedEventArgs<Xamarin.Forms.Picker>)' is marked as an override but no suitable method found to override (CS0115) (Punteam.iOS)
this is my code on Forms project:
using System;
using Xamarin.Forms;
namespace Punteam
{
public class PunteamPicker : Picker
{
}
}
on IOS Project:
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using Xamarin.Forms.Platform;
using Punteam;
using Punteam.iOS;
using UIKit;
using EventKitUI;
[assembly: ExportRenderer (typeof(PunteamPicker), typeof(PunteamPickerRederer))]
namespace Punteam.iOS
{
public class PunteamPickerRederer : PunteamPicker
{
protected override void OnElementChanged (ElementChangedEventArgs<Picker> e)
{
/* base.OnElementChanged (e);
this.Control.TextAlignment = MonoTouch.UIKit.UITextAlignment.Center;
this.Control.TextColor = UIColor.White;
this.Control.BackgroundColor = UIColor.Clear;
this.Control.BorderStyle = UITextBorderStyle.RoundedRect;
this.Layer.BorderWidth = 1.0f;
this.Layer.CornerRadius = 4.0f;
this.Layer.MasksToBounds = true;
this.Layer.BorderColor = UIColor.White.CGColor;*/
}
}
}
Any body know's Why i get this error?
public class PunteamPickerRederer : PunteamPicker
should be
public class PunteamPickerRederer : PickerRenderer

MonoTouch: very simple webView code

I'm creating some web/native hybrid iOS App with some C# background task on MonoTouch.
For a starter, I tried to create very simple webView sample referring
http://docs.xamarin.com/recipes/ios/content_controls/web_view/load_local_content/
http://docs.xamarin.com/recipes/ios/content_controls/web_view/load_local_content/Resources/Loading_Local_Content_(WebView).zip
(The above sample project code works, but I just need a webView without NavigatorView)
and
http://yobriefca.se/blog/2011/12/05/rolling-your-own-phonegap-with-monotouch/
My code so far is:
AppDelegate.cs
using System;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
namespace iostest
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
UIWindow window;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
// create a new window instance based on the screen size
window = new UIWindow (UIScreen.MainScreen.Bounds);
window.RootViewController = new WebViewController();
// make the window visible
window.MakeKeyAndVisible ();
return true;
}
}
}
WebViewController.cs
using System;
using System.IO;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
namespace iostest
{
public class WebViewController : UIViewController {
UIWebView webView;
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
Console.WriteLine ("WebView Launched"); //this works
webView = new UIWebView(View.Bounds);
webView.ScalesPageToFit = false;
webView.LoadRequest (new NSUrlRequest
(new NSUrl (Path.Combine(NSBundle.MainBundle.BundlePath,
"www/app.html"), false)));
this.View.AddSubview(webView);
}
}
}
This code runs without an error, but results with only a blank white page, without showing my HTML content "www/app.html" (or, "http://google.com" whatever).
I don't see what logic I miss. Any thought? Thanks.
OK, things has been fuzzy, but I resolved by myself.
The problem is the local resource files ("www/app.html") should be flagged as 'content' at BuildAction Property of IDE.
I remember I was trapped by this a few years ago, and still see many people are trapped.
Lack of documentation cause wasting time. Please document Xamarin.
The current code for future reference:
AppDelegate.cs
using System;
//using System.Collections.Generic;
//using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
namespace iOStest2
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
UIWindow window;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
window = new UIWindow (UIScreen.MainScreen.Bounds);
window.RootViewController = new WebViewController ();
window.MakeKeyAndVisible ();
return true;
}
}
}
WebViewController.cs
using System;
using System.IO;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
namespace iOStest2
{
public class WebViewController : UIViewController
{
UIWebView webView;
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
Console.WriteLine ("WebView Launched");
View.BackgroundColor = UIColor.Gray;
//string url = "http://google.com";
string url= Path.Combine(NSBundle.MainBundle.BundlePath,
"Content/app.html");
webView = new UIWebView(View.Bounds);
webView.LoadRequest(new NSUrlRequest(new NSUrl(url,false)));
webView.ScalesPageToFit = false;
View.AddSubview(webView);
}
}
}

In Mono For Droid How to move ImageView when I touch it?

I'm using Mono-For-Droid. I have an ImageView and want to move it to follow my finger when I touch it and stop moving when I release my finger.
Here is my code, please advice how do it?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Android.Graphics.Drawables;
using Android.Content.Res;
[assembly: UsesPermission(Name = Android.Manifest.Permission.SystemAlertWindow)]
namespace ExtremeKeyboard
{
[Service]
public class ChatheadService: Android.App.Service
{
System.Threading.Timer _timer;
private IWindowManager windowManager;
private ImageView ReminderHead;
private Drawable icon;
private Android.Views.WindowManagerLayoutParams LOParams;
public override void OnStart(Android.Content.Intent intent, int startId)
{
base.OnStart(intent, startId);
var windowService = this.GetSystemService(Android.Content.Context.WindowService);
var windowManager = windowService.JavaCast<Android.Views.IWindowManager>();
ReminderHead = new ImageView(this);
ReminderHead.SetImageResource(Resource.Drawable.Icon);
LOParams = new Android.Views.WindowManagerLayoutParams(
Android.Views.WindowManagerLayoutParams.WrapContent,
Android.Views.WindowManagerLayoutParams.WrapContent,
Android.Views.WindowManagerTypes.Phone,
Android.Views.WindowManagerFlags.NotFocusable,
Android.Graphics.Format.Translucent);
LOParams.Gravity = GravityFlags.Top | GravityFlags.Left;
LOParams.X = 0;
LOParams.Y = 100;
windowManager.AddView(ReminderHead, LOParams);
}
public override Android.OS.IBinder OnBind(Android.Content.Intent intent)
{
throw new NotImplementedException();
}
}
}

CK30: After using BarcodeReader() my keyboard stops working

I`m developing for a Intermec handheld device CK30 with a 2D reader in C# compact framework 2.0 (windows mobile 6.1).
Everytime I use barcode mey keyboard stops working. Any ideas why?
Heres the code. The first section is a class that configures the barcode reader. The second section is a form that uses the barcode reader to fill a textbox.
After reading something with the barcode reader the keyboard stops working...
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Intermec.DataCollection;
namespace BarCodeReaderTest
{
class LeitorCodigoDeBarras
{
public BarcodeReader LerCodigoDeBarras()
{
try
{
BarcodeReader meuLeitor = new BarcodeReader("default", 4096);
meuLeitor.ScannerEnable = true;
meuLeitor.ThreadedRead(true);
return meuLeitor;
}
catch (BarcodeReaderException bx)
{
MessageBox.Show("Não foi possível inicializar o leitor de código de barras. Contate seu supervisor. \n" + bx.Message);
return null;
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Intermec.DataCollection;
namespace BarCodeReaderTest
{
public partial class Form1 : Form
{
public BarcodeReader leitor;
public Form1()
{
InitializeComponent();
LeitorCodigoDeBarras classeLeitor = new LeitorCodigoDeBarras();
leitor = classeLeitor.LerCodigoDeBarras();
leitor.BarcodeRead += new BarcodeReadEventHandler(this.eventoLeitorCodigoDeBarras);
}
void eventoLeitorCodigoDeBarras(object sender, BarcodeReadEventArgs e)
{
tbCodLido.Text = e.strDataBuffer;
}
}
}
OK, I now relaized that you are using the BarcodeReader within a separate class.
Please try the follwing, standard, example (one listbox and one button in form):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Intermec.DataCollection;
namespace BarcodeReader
{
public partial class Form1 : Form
{
private Intermec.DataCollection.BarcodeReader bcr;
public Form1()
{
InitializeComponent();
bcr = new Intermec.DataCollection.BarcodeReader();
bcr.BarcodeRead += new BarcodeReadEventHandler(bcr_BarcodeRead);
bcr.ThreadedRead(true);
}
void bcr_BarcodeRead(object sender, BarcodeReadEventArgs bre)
{
this.listBox1.Items.Add(bre.strDataBuffer);
}
}
private void btnExit_Click(object sender, EventArgs e)
{
if (bcr !=null)
{
bcr.Dispose();
}
Application.Exit();
}
}
If that works (see also the examples coming with the Intermec Datacollection resource kit), we can examine, why you construct does not work. I assume you have the latest DataCollection Resource Kit installed.

Resources