2016-09-07 8 views
0

私は、ビューページャをホストする主なフラグメントアクティビティ(ホームと呼ばれる)を持つXamarinアンドロイドアプリケーションを持っており、ビューページャにいくつかのフラグメントがあります。フラグメント間でイベントハンドラのインスタンスを追跡する方法

アプリケーションは、クラスをインスタンス化すると、イベントハンドラを介してデータを渡すBluetoothデバイスからデータを取得します。

BTScanner scanner = new BTScanner(); 
scanner.onScanData += BTScanner_onScanData; 

問題は、そのページがアクティブであるとき、私は、私の見解ページャにフラグメントの2にアクティブになるように、このイベントハンドラを必要とする、です。言い換えれば、私がフラグメント1またはフラグメント2にある場合、スキャンデータを受信したいと思います。しかし、同時に両方に移動することはできません。受信したデータの処理があります。あなたがスキャンデータを受け取っているフラグメント。

私がこれまで行ってきたことは、アクティビティに関するカスタムインターフェイスを作成し、それをフラグメントに実装したことです。ビューページャーがページを切り替えるときにフラグメントのメソッドを呼び出すことができます。これらのメソッドに基づいて、私は1ページでイベントハンドラを初期化し、もう一方でinitハンドラを初期化できます。ここでは、フラグメント活動の一例です:必要に応じて私は断片上のインターフェイスを実装するとき、私はonPausePagerFragmentフラグメントに呼び出されますので、

private void ViewPager_PageSelected(object sender, ViewPager.PageSelectedEventArgs e) 
    { 
     int position = (int)e.Position; 

     ICustomFragmentLifecycleForPager fragmentToResume = (ICustomFragmentLifecycleForPager)adapter.InstantiateItem(viewPager, position); 
     fragmentToResume.onResumePagerFragment(previousActiveFragment); 

     ICustomFragmentLifecycleForPager fragmentToPause = (ICustomFragmentLifecycleForPager)adapter.InstantiateItem(viewPager, previousActiveFragment); 
     fragmentToPause.onPausePagerFragment(); 

     previousActiveFragment = position; 
    } 

したがって、これで、私はそれが働いている私は非初期化をすることができ、 onResumePagerFragmentを初期化することができます。

私が持っている問題は、実際に最初の起動時に発生した問題です。最初の起動時に、私が最初に表示するためのフラグメントを設定していると私はそれを行う際に、

ViewPager_PageSelected 

は、このように初期化または脱-INITスキャナに私のカスタムインターフェイスのメソッドを呼び出していない、最初に呼び出されません。

私がすでに試したことの1つは、アプリケーションの開始時に理論的に呼び出されるアクティビティのonCreate(onStartupとonResumeでも試してみた)メソッド呼び出しを入れて、どのフラグメントが起動時にアクティブになり、インターフェイスメソッドを強制的に起動させます。しかし、これは不器用な感じで、適切に動作していません。正常に動作していないことに加えて、私はフラグメントの中でインターフェイスによって呼び出されたメソッドonResumePagerFragmentが、アクティビティのonCreateに強制的に挿入されるため、インターフェイスメソッドが起動しないときに、

var activity = (Home)Activity; 

これは前に働いていたので、私は活動が完全にはまだ開始されていないので、インターフェースが断片上のメソッドを呼び出す前に、これが起こっていると思われるコード内の他の場所で作業を続けて:ここでの活動の場合はnullアクティビティへの参照を取得しようとします。繰り返しますが、私はonResumeとonStartでこれをやってみましたが、まだnullが返っています。

私のようなシナリオを処理するには、一般的にはどのような方法が良いのですか?しかし、それはフラグメント/ビューページャのコンテナ以外の何ものでもありません。イベントハンドラは一度にフラグメントでアクティブになりますか?私はインタフェースを使うか、むしろ静的なクラスを使う必要があるでしょうか?私が静的なクラスを使用する場合は、それぞれのクラスのインスタンスを取得する方法を知っていますが、次にイベントハンドラを作成し、別のフラグメントがインスタンスを取得したときにも登録を解除するようにしますか?

ありがとうございます!

マイク

答えて

1

私はあなたのC#のコードを見ることができませんでしたが、私の答えは下にあなたにヒントを与えることができます。

https://stackoverflow.com/a/30554102/361100

AndroidはネイティブEventBusを提供し、私が見つけXamarinは、代替的MessageBus componentであることに留意されたいです。

第2に、イベントが発生したときにサービスがすべてのデータ通信の委任者として機能するように、Serviceを作成することができます。

結局のところ、フラグメントは修復時に同じフラグメントを与えることを保証せず、特にViewPagerと一緒に使用するといつでもガベージコレクションされると考えることができます。

+0

私は完全に理解しているとは思わない、私はまだノブのビットです。しかし、私は最も簡単なアプローチを望んでおり、おそらくサービスアプローチのような追加のレイヤーから離れていきたいと考えています。私がしたいことへの簡単なアプローチはありますか?アクティビティからの私のインターフェイスがフラグメント上のメソッドを呼び出すときに、なぜActivityがnullであるのかに関する説明がありますか?ありがとう! –

+0

@MichaelBedford //リストアプロセスの後で 'null'の場合は、この投稿が役に立ちます。 http://vardhan-justlikethat.blogspot.kr/2014/05/fragment-lifecycle-with-respect-to-its.htmlフラグメントはアクティビティの前にリストアされます。この場合、アクティビティはフラグメント側で_null_です。 – Youngjae

+0

あなたが投稿した記事を読みましたが、まだ少し混乱しています。ライフサイクルを理解しています(私はその記事を読んでいます)。私がonStartやonResumeを自分のアクティビティで使用していると、私が抱えている問題は発生してはいけないはずです。それまでに、アクティビティの完了をオンにするだけでなく、フラグメントも完全にする必要があります。したがって、サイクルのその段階でフラグメントからアクティビティにアクセスするときにnullになるべきではないでしょうか? –

関連する問題