2016-08-15 74 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

您应该在您的首选项中存储loggedIn布尔值或某个键,以检查您是否想知道用户是否已登录 – 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; 
     } 

在这我只是要务实使用performClick()方法调用Button onClick,它会自动替换我的片段。

更好的解决办法是改变viewPager的当前项目看一看这个解决方案pager.setCurrentItem(num)

如果你想viewPager单个标签上显示不同的片段,然后应用在getItems布尔条件()的片段的方法适配器。然后调用viewPager.setCurrentItem(int)函数。

确保您的片段适配器扩展FragmentStatePagerAdapter

+0

如果用户已登录或未从共享首选项登录,它会正常工作,如果我重新加载应用程序,但仍然使用应用程序时,它保留了用户登录时的最初片段,这是一个非常糟糕的用户体验。 – SimpiMind

+0

必须有一些代码会检查用户是否登录并执行一些任务。在这段代码中,你可以像这样替换你的片段http://stackoverflow.com/a/18940937/6634982。如果你使用的ViewPager你使用setPage函数 –

+0

我有一个代码,检查用户是否已登录,并且我正在使用视图分页器与三个选项卡,我只想用两个不同的片段中的任何一个替换第一个选项卡挂起if用户是否登录。既然你已经有了这个问题的想法,我该如何解决它。谢谢。 – SimpiMind