본문 바로가기

프로그래밍/안드로이드-자마린폼즈

Xamarin Forms 에서 클립보드 이벤트 처리 2

2019/06/18 - [프로그래밍/안드로이드-자마린폼즈] - Xamarin Forms 에서 클립보드 이벤트 처리 1

 

Xamarin Forms 에서 클립보드 이벤트 처리 1

Xamarin Forms에서 ClipBoard의 변경을 모니터링 해서 처리하는 방법. 안드로이드 프로젝트의 Activity에 구현하고 Forms 프로젝트와 인터페이싱을 통해 처리할수 있다. MainActivity.cs using Android.App; using..

tother.tistory.com

이전글에 이어 이벤트를 PCL 프로젝트에서 받아서 처리하는 코드 예제를 작성하였다.

여러가지 방법이 있겠지만 일단 생각나는데로 구현해 보았다.

사실 모바일 및 xamarin 프로젝트가 처음이라 내맘데로 구현했다.

예제는 클립보드에 텍스트가 복사되었을 때 이벤트를 현재 떠있는 화면에 전달하여 처리한다.

 

PCL 프로젝트

 

현재 페이지를 가져와서 Clipboard 이벤트를 처리하는 페이지인지 판단 후 

처리하는 페이지일 경우, 페이지의 함수를 호출하여 text를 넘겨준다. text처리는 각 페이지에서 구현하면 된다.

 

ClipboardServiceManager.cs

public class ClipboardServiceManager
    {
        public void SetText(string text)
        {
            Page curPage = Application.Current.MainPage;
            
            if(curPage is NavigationPage)
            {
                 if (((NavigationPage)curPage).CurrentPage is IScanPage)
                 {
                    ((IScanPage)((NavigationPage)curPage).CurrentPage).Scan(text);
                 }
            }
        }
    }

 

Clipboard 이벤트를 처리하는 페이지는 아래 인터페이스를 상속하도록 한다.

 

IScanPage.cs

interface IScanPage
{
    void Scan(string text);
}

 

아래처럼 인터페이스 상속 후 Scan 함수를 구현하여 처리한다.

 

Example.cs

public partial class Example : ContentPage, IScanPage
    {
        public Example()
        {
            InitializeComponent();       
        }

        public void Scan(string text)
        {
            ;
        }
    }

 

Android 프로젝트와의 인터페이싱을 위해 App.cs 에 ClipboardServiceManager 클래스를 static으로 선언한다.

 

App.cs

public partial class App
    {
        public static ClipboardServiceManager ScanManager { get; set; }

        public App() : this(null) { }

        public App(IPlatformInitializer initializer) : base(initializer) { }

        protected override void OnStart()
        {
            base.OnStart();

            if (Device.RuntimePlatform == Device.iOS)
            {

            }

            if (Device.RuntimePlatform == Device.Android)
            {

            }
        }
    }

 

Android 프로젝트

 

MainActivity에서 PCL 프로젝트의 Clipboard Manager를 생성하고 Clipboard 이벤트 발생 시 데이터를 전달한다.

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            
            base.OnCreate(bundle);

            ClipboardManager clipManager =  (ClipboardManager)GetSystemService(ClipboardService);
            clipManager.PrimaryClipChanged += clipManager_PrimaryClipChanged;

            App.ScanManager = new ClipboardServiceManager();

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App(new AndroidInitializer()));
        }

        private void clipManager_PrimaryClipChanged(object sender, EventArgs e)
        {
            App.ScanManager.SetText( ((ClipboardManager)sender).Text );
        }
    }