Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 重新加载活动以在片段之间重新切换_Android_Switch Statement_Fragment_Adapter - Fatal编程技术网

Android 重新加载活动以在片段之间重新切换

Android 重新加载活动以在片段之间重新切换,android,switch-statement,fragment,adapter,Android,Switch Statement,Fragment,Adapter,我有一个带有三个片段的TabLayout,在第一个选项卡上,我想根据条件在两个片段之间切换,我使用了if语句,但片段仍然没有切换,它只保留了它的初始片段。下面是案例场景和我所做工作的代码片段 我的应用程序允许用户决定是否在第一次使用时登录,我的主要活动是启动器,主要活动(包含一个TabLayout和三个Fragment)适配器检查用户是否登录。 if (user != login) { load fragment A }else{ load fragment B } if (user

我有一个带有三个片段的
TabLayout
,在第一个选项卡上,我想根据条件在两个片段之间切换,我使用了if语句,但片段仍然没有切换,它只保留了它的初始片段。下面是案例场景和我所做工作的代码片段

我的应用程序允许用户决定是否在第一次使用时登录,我的主要活动是启动器,主要活动(包含一个
TabLayout
和三个
Fragment
)适配器检查用户是否登录。

if (user != login) {
  load fragment A
}else{
  load fragment B
}
if (user != login) {
   load fragment A
} 
我有一个选项,用户可以在使用应用程序时登录, 如果用户单击“登录”按钮,它将加载一个供用户登录的片段,一旦用户登录,片段仍保留用户未登录的状态,即其仍在加载片段a,但我可以在应用程序中看到所有用户登录的详细信息。

这一点仍然有效

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

if (user != login) {
  load fragment A
}else{
  load fragment B
}
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();
            }
首先,您应该使用检查用户是否登录

此外,您可以在片段中使用此代码来检查此片段是否可见。如果可见,您可以执行所需的任务,从共享首选项获取登录信息

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的当前项看看这个解决方案

如果要在viewPager的单个选项卡上显示不同的片段,请在片段适配器的getItems()方法中应用布尔条件。然后调用
viewPager.setCurrentItem(int)
函数

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

首先您应该使用它来检查用户是否登录

此外,您可以在片段中使用此代码来检查此片段是否可见。如果可见,您可以执行所需的任务,从共享首选项获取登录信息

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的当前项看看这个解决方案

如果要在viewPager的单个选项卡上显示不同的片段,请在片段适配器的getItems()方法中应用布尔条件。然后调用
viewPager.setCurrentItem(int)
函数


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

请提供更多详细信息,您的问题不完整请添加多一点代码,您正在使用
FragmentManager
的部分添加/替换当前的
片段
。另外,在初始化
NewsFragment
NewsAllFragment
的位置添加断点,以检查是否实际调用了它。您应该在首选项中存储一个loggedIn布尔值或某个键,以检查您是否想知道用户是否已登录。请提供更多详细信息,您的问题是不完整添加一点代码,即您正在使用
FragmentManager
添加/替换当前
片段的部分。另外,在初始化
NewsFragment
NewsAllFragment
的位置添加断点,以检查它是否实际被调用。您应该在首选项中存储一个loggedIn布尔值或某个键,以检查您是否想知道用户是否已登录。我正在获取用户是否从共享首选项登录,如果我重新加载应用程序,它可以正常工作,但在仍然使用应用程序时,当用户登录时,它会保留其初始片段,这是一种非常糟糕的用户体验。必须有一些代码来检查用户是否登录并执行某些任务。在这段代码中,您可以像这样替换片段。Anf如果您使用的是viewpager您使用的是setPage功能我有一个代码可以检查用户是否登录,并且我使用的是带有三个选项卡的viewpager,如果用户是否登录,我只想用两个不同的待处理片段中的任何一个替换第一个选项卡。既然你已经有了这个问题的想法,我该如何解决它呢。谢谢。如果用户登录或未登录共享首选项,我会得到答案。如果我重新加载应用程序,效果会很好,但在仍然使用应用程序时,它会在用户登录时保留其初始片段,这是一种非常糟糕的用户体验。必须有一些代码来检查用户是否登录并正在执行某些任务。在这段代码中,您可以像这样替换片段。Anf如果您使用的是viewpager您使用的是setPage功能我有一个代码可以检查用户是否登录,并且我使用的是带有三个选项卡的viewpager,如果用户是否登录,我只想用两个不同的待处理片段中的任何一个替换第一个选项卡。既然你已经有了这个问题的想法,我该如何解决它呢。谢谢