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。还要在初始化NewsFragmentNewsAllFragment 的位置添加断点,以检查它是否实际被调用。 您应该在首选项中存储一个 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

activity与fragment之间传递数据

Android 兼容包不包含 Activity.getFragmentManager()

Fragment

从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()

Webpack / react hot reload重新加载整个页面?