#android #android-fragments #tabs #google-analytics #android-actionbar
#Android #android-фрагменты #вкладки #google-analytics #android-actionbar
Вопрос:
Я использую вкладки ViewPager и ActionBar для отображения данных пользователю, а также хочу отправить текущий экран в Google Analytics.
Но у меня проблема, потому что вкладки ActionBar работают таким образом, что они загружают данные для текущего и следующего фрагмента, поэтому в режиме реального времени Google Analytics отображается только следующий фрагмент.
Для каждого фрагмента на вкладках ActionBar я отправляю данные в Google Analytics следующим образом:
@Override
public void onStart() {
// Get an Analytics tracker to report app starts amp; uncaught exceptions
// etc.
// Get tracker.
Tracker t = ((MyApplication) getActivity().getApplication())
.getTracker(TrackerName.APP_TRACKER);
// Set screen name
t.setScreenName(screenName);
// Send a screen view.
t.send(new HitBuilders.AppViewBuilder().build());
super.onStart();
}
Как я могу решить эту проблему?
Комментарии:
1. Вы пробовали перемещать отслеживание туда
ViewPager
, где переключаются вкладки?
Ответ №1:
Я обнаружил, что проверка комбинации getUserVisibleHint()
и isResumed()
внутри каждого фрагмента перед отправкой события GA screenview работает. Переопределение setUserVisibleHint(boolean)
и onResume()
гарантирует, что событие просмотра экрана отправляется независимо от порядка, в котором они вызываются.
Это решение решает проблему с использованием ViewPager.setOnPageChengeListener
, когда исходный фрагмент не onPageSelected
вызывается.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
publishScreenViewEvent();
}
@Override
public void onResume() {
super.onResume();
publishScreenViewEvent();
}
private void publishScreenViewEvent() {
// Only publish if this fragment is visible to the user and the fragment has been resumed.
// setUserVisibleHint may be called before onResume and before this fragment is injected.
// onResume may be called before setUserVisibleHint because this fragment is in a ViewPager that
// caches the next and previous fragment by calling onResume before the fragment is visible
if (getUserVisibleHint() amp;amp; isResumed()) {
// Send GA screenview event here
}
}
Комментарии:
1. это должен быть принятый ответ. Это работает блестяще!
2. Это не удается при повороте экрана и при первом вызове onResume() . Вызывает повторяющиеся вызовы
3. @sha есть предложения о том, как решить проблему с вращением?
4. @jenglert Пока нет. Нет времени:( . Но есть идея сохранить uservisibility в onSavedStateInstance() и использовать его в качестве маркера для остановки повторяющихся вызовов. Дайте мне знать, если это сработает, или если вы найдете что-то лучше.
5.@jenglert Пока нет. Нет времени:( . Но есть идея сохранить uservisibility в onSavedStateInstance() и использовать его в качестве маркера для остановки повторяющихся вызовов. Дайте мне знать, если это сработает, или если вы найдете что-то лучше.
Ответ №2:
Я решил эту проблему следующим образом: 1. Когда начинается моя активность, я размещаю
Utils.sendGAScreenName("Highlights", this);
ActivityProducts_.intent(this).start();
Это помогает мне справиться с открытием первой вкладки.
2.In ActivityProducts i определенный onPageChangeListener()
метод
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
//Log.d("OnPageSelected " position);
switch (position)
{
case TAB_HIGHLIGHTS:
Utils.sendGAScreenName("Highlights", ActivityProducts.this);
break;
case TAB_APPLICATIONS:
Utils.sendGAScreenName("LT Brands", ActivityProducts.this);
break;
case TAB_PRODYCT_TYPE:
Utils.sendGAScreenName("Product Type", ActivityProducts.this);
break;
case TAB_ALL_PRODUCTS:
Utils.sendGAScreenName("All Products", ActivityProducts.this);
break;
}
}
});
Комментарии:
1. Для меня это не вызывалось, когда viewpager был только что создан и показал первую страницу. Только при ручной смене страниц.