Как отправить представление в Google Analytics с помощью Android View Pager вкладки ActionBar?

#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 был только что создан и показал первую страницу. Только при ручной смене страниц.