У меня есть приложение для андроида 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.
С учетом всего сказанного, как лучше всего справиться с таким сценарием, как мой, где у меня есть основное действие, которое начинается, но затем является не чем иным, как контейнером пейджера фрагмента/представления, и мне нужно иметь один экземпляр для обработчик события активен по фрагменту за раз? Должен ли я даже использовать интерфейс или, скорее, использовать статический класс? Если я использую статический класс, я знаю, как получить экземпляр класса для каждого, но как вы затем создаете обработчик событий. И не забудьте также зарегистрировать его, когда другой фрагмент захватывает экземпляр?
Спасибо!
Майк
Я не думаю, что полностью понимаю, я все еще немного нуб. Тем не менее, я хотел бы получить самый простой подход и, вероятно, хочу держаться подальше от дополнительных слоев, таких как сервисный подход. Есть ли простой подход к тому, что я хочу сделать? Есть ли какие-то объяснения относительно того, почему Activity имеет значение null, когда мой интерфейс от действия вызывает метод на фрагменте? Благодаря! –
@MichaelBedford // в случае вашего «нулевого» процесса восстановления этот пост вам поможет. http://vardhan-justlikethat.blogspot.kr/2014/05/fragment-lifecycle-with-respect-to-its.html Фрагмент восстанавливается перед активностью. в этом случае Activity - _null_ со стороны Фрагмента. – Youngjae
Я прочитал статью, которую вы опубликовали, и я все еще немного смущен. Я понимаю (тем более теперь, когда я читал эту статью) жизненные циклы. Похоже, что у меня не должно быть проблем, которые у меня возникают, если я использую onStart или даже onResume в своей деятельности. К тому времени не только должно завершаться, но и фрагмент должен быть полным. Поэтому я не должен получать нуль при доступе к активности из фрагмента на этом этапе цикла, правильно? –