2016-08-15 5 views
1

У меня есть TabLayout с тремя фрагментами, на первой вкладке я хочу переключиться между двумя фрагментами в зависимости от условия, я использовал оператор if, но все же фрагменты не переключают его, сохраняя его начальный фрагмент. Ниже приведен пример сценария и фрагмент кода того, что вы делаете.Перезагрузка Активность для повторного переключения между фрагментами

МОЕ приложение позволяет пользователю решить, если они должны войти в систему при первом использовании или нет, и моя основная деятельность является пусковая, основным видом деятельности (в Содержащ TabLayout и три Fragment) адаптер проверяет, если пользователь вошел в систему или нет ,

if (user != login) { 
    load fragment A 
}else{ 
    load fragment B 
} 

У меня есть возможность где-то, где пользователь может войти в то время как с помощью приложения, , если пользователь нажимает на кнопку входа, он загружает fragement для пользователя, чтобы войти в систему, когда пользователь вошел в систему, фрагмент все еще сохраняют состояние пользователя, не зарегистрированное, т.е. его по-прежнему загружаемое фрагмент A, но затем я могу видеть все данные для входа в систему в приложении.

этот момент все еще активна

if (user != login) { 
    load fragment A 
} 

Код сниппета

@Override 
public Fragment getItem(int position) { 
    Fragment f; 
    switch (position) { 
     case NEWS_POST: 
      if(fbid != null){ 
       f = new NewsFragment(); 
      }else{ 
       f = new NewsAllFragment(); 
      } 
+0

просьба предоставить более подробную информацию, ваш вопрос является неполным –

+0

Добавить немного больше кода, ту часть, где вы используете '' FragmentManager' для добавления/replace' ток 'Fragment'. Также добавьте контрольные точки, в которых вы инициализируете 'NewsFragment' и' NewsAllFragment', чтобы проверить, действительно ли он вызывается. – Abbas

+0

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

ответ

0

Сначала вы должны использовать SharedPreferences для проверки пользователь вошел в систему или нет.

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

private static boolean m_iAmVisible; 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    m_iAmVisible = isVisibleToUser; 

    if (m_iAmVisible) { 
     Log.d(localTAG, "this fragment is now visible"); 
    } else { 
     Log.d(localTAG, "this fragment is now invisible"); 
    } 
} 

Вот видите у меня есть фрагмент, в котором я использую ViewPager в onCreateView Метод

final View x = inflater.inflate(R.layout.consumer_tab_layout, null); 
     tabLayout = (TabLayout) x.findViewById(R.id.tabs); 
     viewpager_for_tabs = (ViewPager) x.findViewById(R.id.viewpager_for_tabs); 


     bottom_tv1 = (TextView) x.findViewById(R.id.bottom_tv1); 
     bottom_tv2 = (TextView) x.findViewById(R.id.bottom_tv2); 
     bottom_tv3 = (TextView) x.findViewById(R.id.bottom_tv3); 
     bottom_tv4 = (TextView) x.findViewById(R.id.bottom_tv4); 
     bottom_tv5 = (TextView) x.findViewById(R.id.bottom_tv5); 

     /** 
     *Set an Apater for the View Pager 
     */ 
     viewpager_for_tabs.setAdapter(new MyAdapter(getChildFragmentManager())); 
     viewpager_for_tabs.setOffscreenPageLimit(5); 

     /** 
     * Now , this is a workaround , 
     * The setupWithViewPager dose't works without the runnable . 
     * Maybe a Support Library Bug . 
     */ 

     viewpager_for_tabs.setOnPageChangeListener(myOnPageChangeListener); 
     bottom_tv1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv1, R.drawable.d1); 
       viewpager_for_tabs.setCurrentItem(0, false); 
      } 
     }); 
     bottom_tv2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv2, R.drawable.d2); 
       viewpager_for_tabs.setCurrentItem(1, false); 
      } 
     }); 
     bottom_tv3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv3, R.drawable.d3); 
       viewpager_for_tabs.setCurrentItem(2, false); 
      } 
     }); 
     bottom_tv4.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv4, R.drawable.d4); 
       viewpager_for_tabs.setCurrentItem(3, false); 
      } 
     }); 
     bottom_tv5.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv5, R.drawable.d5); 
       viewpager_for_tabs.setCurrentItem(4, false); 
      } 
     }); 

     tabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       tabLayout.setupWithViewPager(viewpager_for_tabs); 


      } 
     }); 

     return x; 

И адаптер Методы GetItem

@Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
         return new fragment(); 

       case 1: 
        return frag2.getInstance(); 
       case 2: 
        return frag3.getInstance(); 
       case 3: 
        return frag4.getInstance(); 
       case 4: 
        return frag5.getInstance(); 
      } 
      return null; 
     } 

В это я просто прагматично call on onClick, используя метод performClick() для представлений, и он автоматически заменит мой фрагмент.

лучшим решением было бы изменить текущий элемент ViewPager Посмотрите на это решение pager.setCurrentItem(num)

Если вы хотите, чтобы показать различные фрагменты на одной вкладке ViewPager затем применить логическое условие в GetItems() метод вашего фрагмента адаптер. затем вызовите функцию viewPager.setCurrentItem(int).

Убедитесь, что адаптер Fragment расширяет FragmentStatePagerAdapter класс

+0

Я получаю, если пользователь вошел в систему или не использовал общие предпочтения, он отлично работает, если я перезагружаю приложение, но при использовании приложения он сохраняет свой первоначальный фрагмент при входе пользователя в систему, что является очень плохим пользовательским интерфейсом. – SimpiMind

+0

Должен быть какой-то код, который будет проверять при входе пользователя в систему и выполнении некоторой задачи. В этом фрагменте кода вы можете заменить свой фрагмент следующим образом: http://stackoverflow.com/a/18940937/6634982. Anf, если вы используете viewpager, вы используете функцию setPage –

+0

У меня есть код, который проверяет, зарегистрирован ли пользователь, и я использую view pager с тремя вкладками, я хочу только заменить первую вкладку на любой из двух разных фрагментов, ожидающих, если пользователь вошел в систему или нет. так как у вас уже есть идея, проблема у меня есть, как я могу ее решить. Благодарю. – SimpiMind

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