2016-09-07 3 views
0

У меня есть приложение для андроида Xamarin, которое имеет основную активность фрагмента (с именем Home), в которой размещается пейджер представления, а затем несколько фрагментов в представлении пейджера.Как отслеживать экземпляр обработчика событий по фрагментам

Приложение получает данные от устройства Bluetooth, которое передает данные через обработчик событий, когда я создаю экземпляр класса.

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

Этот вопрос, мне нужен этот обработчик события, чтобы быть активным на двух фрагментов, на мой взгляд пейджера, когда эта страница активна. Другими словами, я хочу получить данные сканирования, если я нахожусь на фрагменте1 или фрагменте2. Однако я не могу заставить его перейти к обоим одновременно, происходит обработка полученных данных, и обработка отличается в зависимости от того, фрагмент, в который вы получаете данные сканирования.

Что я до сих пор создавал пользовательский интерфейс для деятельности и реализовал его во фрагментах. Это позволит мне вызвать метод на фрагментах, когда пейджер представления переключает страницы. На основе этих методов я могу деинсталлировать обработчик событий на одной странице и инициировать его с другой. Вот пример на фрагмент деятельности:

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; 
    } 

Поэтому с этим, у меня он работает, как нужно, потому что когда я реализовать интерфейс на фрагменты, я получаю onPausePagerFragment называется на фрагменте я-де-инициализации, и onResumePagerFragment на фрагменте, который я могу инициализировать.

Все, что сказал, проблема, с которой я столкнулась, на самом деле при первом запуске. При первом запуске, я устанавливаю фрагмент, чтобы показать первый и когда я делаю это,

ViewPager_PageSelected 

не вызывается изначально, таким образом, не вызывая мои методы пользовательских интерфейсов для инициализации или де-инициализации сканера.

Одна вещь, которую я уже пробовал, заключается в том, чтобы поместить вызов метода в onCreate из действия (также попробовал его в onStartup и onResume), который теоретически будет называться только один раз при запуске приложения и затем будет проверять, какой фрагмент активны при запуске и принудительно запускают методы интерфейса. Однако это неудобно и не работает должным образом. В дополнение к тому, что я не работаю должным образом, я также получаю нулевые исключения в фрагменте, когда метод интерфейса запускается, потому что я принудительно его включаю в onCreate из действия, метод, который вызывается интерфейсом на фрагменте, onResumePagerFragment, возвращает нуль для деятельности здесь:

var activity = (Home)Activity; 

Это работал до и продолжает работать в других местах в коде, так что я подозреваю, что это происходит потому, что деятельность полностью не началась до того, как интерфейс вызывает метод фрагмента и он пытается получить ссылку на эту деятельность. Опять же, я пробовал делать это в onResume и onStart, но я все равно получаю null.

С учетом всего сказанного, как лучше всего справиться с таким сценарием, как мой, где у меня есть основное действие, которое начинается, но затем является не чем иным, как контейнером пейджера фрагмента/представления, и мне нужно иметь один экземпляр для обработчик события активен по фрагменту за раз? Должен ли я даже использовать интерфейс или, скорее, использовать статический класс? Если я использую статический класс, я знаю, как получить экземпляр класса для каждого, но как вы затем создаете обработчик событий. И не забудьте также зарегистрировать его, когда другой фрагмент захватывает экземпляр?

Спасибо!

Майк

ответ

1

Я не мог бы показать вам C# код, но ниже мой ответ может дать вам подсказку.

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

Обратите внимание, что Android изначально обеспечивает EventBus и Xamarin я нашел MessageBus component в качестве альтернативы.

Во-вторых, вы можете сделать Service, чтобы служба действовала как делектор всей передачи данных при каждом запуске событий.

В заключение мы могли подумать, что Фрагмент не гарантирует, чтобы тот же фрагмент был восстановлен, и особенно это сбор мусора в любое время, когда он используется с ViewPager.

+0

Я не думаю, что полностью понимаю, я все еще немного нуб. Тем не менее, я хотел бы получить самый простой подход и, вероятно, хочу держаться подальше от дополнительных слоев, таких как сервисный подход. Есть ли простой подход к тому, что я хочу сделать? Есть ли какие-то объяснения относительно того, почему Activity имеет значение null, когда мой интерфейс от действия вызывает метод на фрагменте? Благодаря! –

+0

@MichaelBedford // в случае вашего «нулевого» процесса восстановления этот пост вам поможет. http://vardhan-justlikethat.blogspot.kr/2014/05/fragment-lifecycle-with-respect-to-its.html Фрагмент восстанавливается перед активностью. в этом случае Activity - _null_ со стороны Фрагмента. – Youngjae

+0

Я прочитал статью, которую вы опубликовали, и я все еще немного смущен. Я понимаю (тем более теперь, когда я читал эту статью) жизненные циклы. Похоже, что у меня не должно быть проблем, которые у меня возникают, если я использую onStart или даже onResume в своей деятельности. К тому времени не только должно завершаться, но и фрагмент должен быть полным. Поэтому я не должен получать нуль при доступе к активности из фрагмента на этом этапе цикла, правильно? –

Смежные вопросы