Reload Activity 以在 Fragment 之间重新切换
Posted
技术标签:
【中文标题】Reload Activity 以在 Fragment 之间重新切换【英文标题】:Reload Activity to re-switch between fragments 【发布时间】:2016-12-21 15:00:14 【问题描述】:我有一个带有三个片段的TabLayout
,在第一个选项卡上,我想根据条件在两个片段之间切换,我使用了 if 语句,但片段仍然没有切换,它只保留其初始片段。以下是案例场景和代码sn-p在做什么。
我的应用程序允许用户在第一次使用时决定是否登录,我的主要活动是启动器,主要活动的(包含一个TabLayout
和三个Fragment
)适配器检查用户是否已登录在与否。
if (user != login)
load fragment A
else
load fragment B
我有一个选项,用户可以在使用应用程序时登录, 如果用户点击登录按钮,它会加载一个片段供用户登录,一旦用户登录,片段仍然保持用户未登录的状态,即它仍然加载片段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();
【问题讨论】:
请提供更多细节,您的问题不完整 添加更多代码,您使用FragmentManager
的部分到add/replace
当前Fragment
。还要在初始化NewsFragment
和NewsAllFragment
的位置添加断点,以检查它是否实际被调用。
您应该在首选项中存储一个 loggedIn 布尔值或某个键,以检查您是否想知道用户是否已登录
【参考方案1】:
首先你应该使用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");
这里看到我有一个片段,我在 onCreateView 方法中使用 viewPager
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)
函数。
确保您的 Fragment 适配器扩展 FragmentStatePagerAdapter
类
【讨论】:
我知道用户是否从共享偏好登录,如果我重新加载应用程序,它工作正常,但是在仍然使用应用程序时,它会在用户登录时保留其初始片段,这是非常糟糕的用户体验。 必须有一些代码可以检查用户是否登录并执行某些任务。在那段代码中,您可以像***.com/a/18940937/6634982 一样替换您的片段。 Anf 如果您使用的是 viewpager,则使用 setPage 函数 我有一个检查用户是否登录的代码,并且我正在使用带有三个选项卡的视图寻呼机,我只想用两个不同的片段中的任何一个替换第一个选项卡,如果用户是登录与否。既然您已经知道问题所在,我该如何解决。谢谢。以上是关于Reload Activity 以在 Fragment 之间重新切换的主要内容,如果未能解决你的问题,请参考以下文章
Activity 与 Fragment通信方式-Android
Android 兼容包不包含 Activity.getFragmentManager()
从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()