【问题标题】:Switching back in tabs在选项卡中切换回来
【发布时间】:2015-10-16 17:21:30
【问题描述】:

我有三个带有页面查看器和操作栏的标签。当我尝试切换回已选择的选项卡时,未显示任何数据,但 logcat 表明数据已从服务器拉出并添加到数组列表中。

关于为什么数据现在不会显示的任何建议?我进行了广泛的研究,但仍然无法理解发生了什么。

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_tabs);

        viewPager = (ViewPager) findViewById(R.id.pager);
        Log.v("Main-onCreate-viewPager", viewPager.toString());
        actionBar = getSupportActionBar();

        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(mAdapter);

        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
            Log.v("Main", "tab added");
        }


        /**
         * on swiping the viewpager make respective tab selected
         **/
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                Log.v("onPageScrolled-position", Integer.toString(position));
                Log.v("onPageScrolled-position", Float.toString(positionOffset));
                Log.v("onPageScrolled-position", Integer.toString(positionOffsetPixels));
            }

            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                Log.v("onPageSelected", "onPageSelected");
                actionBar.setSelectedNavigationItem(position);
                Log.v("onPageSelected-position", Integer.toString(position));
        }


            public void onPageScrollStateChanged(int state) {
                Log.v("StateChanged", "OnPageScrollStateChanged");
                Log.v("statechanged-state", Integer.toString(state));

            }
        });
    }
   public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
            Log.v("Main", "Tab REselected");
            Log.v("onTabReselected", tab.toString());
            Log.v("onTabReselected", ft.toString());

            if(tab.getPosition() == 0){
                Log.v("onTabReselected", "ImagesFragment");
                Fragment frag;
                FragmentManager fm1 = Main.this.getSupportFragmentManager();
                FragmentTransaction ft1 = fm1.beginTransaction();
                frag = new ImagesFragment();
                //frag = new FeaturesFragment();
                ft1.replace(R.id.pager, frag);
                ft1.commit();
                frag.setUserVisibleHint(true);
            }

            if (tab.getPosition() == 1) {
                Log.v("onTabReselected", "FeaturesFragment");
                Fragment frag;
                FragmentManager fm1 = Main.this.getSupportFragmentManager();
                FragmentTransaction ft1 = fm1.beginTransaction();
                frag = new FeaturesFragment();
                ft1.replace(R.id.pager, frag);
                ft1.commit();
                frag.setUserVisibleHint(true);

            }

            if (tab.getPosition() == 2) {
                Log.v("onTabReselected", "OptionsFragment");
                Fragment frag;
                FragmentManager fm1 = Main.this.getSupportFragmentManager();
                FragmentTransaction ft1 = fm1.beginTransaction();
                frag = new OptionsFragment();
                ft1.replace(R.id.pager, frag);
                ft1.commit();
                frag.setUserVisibleHint(true);

            }
        }

        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
            // on tab selected
            // show respected fragment view
            Log.v("onTabSelected", tab.toString());
            Log.v("onTabSelected", ft.toString());
            Log.v("tab position1", Integer.toString(tab.getPosition()));
            viewPager.setOffscreenPageLimit(0);
            //viewPager.setCurrentItem(tab.getPosition()); //null pointer exception here
            tab.select(); //no null pointer exception, but no show data when swiping tabs
            Log.v("onTabSelected", tab.toString());

            Log.v("tab position", Integer.toString(tab.getPosition()));

             if (tab.getPosition() == 0) {

                Fragment frag;
                FragmentManager fm1 = Main.this.getSupportFragmentManager();
                FragmentTransaction ft1 = fm1.beginTransaction();
                 frag = new ImagesFragment();
                ft1.replace(R.id.pager, frag);
                ft1.commit();
                frag.setUserVisibleHint(true);
            }

                if (tab.getPosition() == 1) {

                    Fragment frag;
                    FragmentManager fm1 = Main.this.getSupportFragmentManager();
                    FragmentTransaction ft1 = fm1.beginTransaction();
                    frag = new FeaturesFragment();
                    ft1.replace(R.id.pager, frag);
                    ft1.commit();
                    frag.setUserVisibleHint(true);

                }

                if (tab.getPosition() == 2) {
                    Fragment frag;
                    FragmentManager fm1 = Main.this.getSupportFragmentManager();
                    FragmentTransaction ft1 = fm1.beginTransaction();
                    frag = new OptionsFragment();
                    ft1.replace(R.id.pager, frag);
                    ft1.commit();
                    frag.setUserVisibleHint(true);

                }
            }


        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
            Log.v("Main", "Tab UNselected");
            Log.v("onTabUnselected", tab.toString());
            Log.v("onTabUnselected", ft.toString());
     }




public class TabsPagerAdapter extends FragmentStatePagerAdapter {

    public TabsPagerAdapter(FragmentManager fm) {

        super(fm);
    }

    @Override
    public Fragment getItem(int index) {
        Log.v("index", Integer.toString(index));
        switch (index) {
            case 0:
                Log.v("TabsPagerAdapter", "case 0: ImagesFragment");
                return new ImagesFragment();
            case 1:
                Log.v("TabsPagerAdapter", "case 1: FeaturesFragment");
                return new FeaturesFragment();
            case 2:
                Log.v("TabsPagerAdapter", "case 2: OptionsFragment");
                return new OptionsFragment();
        }

        return null;
    }



    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 3;
    }
}

【问题讨论】:

  • 你试过我的解决方案了吗?

标签: android android-fragments android-tabs


【解决方案1】:

使用 FragmentStatePagerAdapter 代替 TabsPagerAdapter。

【讨论】:

  • 请详细说明。我有一个名为 TabsPagerAdapter 的类,它扩展了 FragmentStatePagerAdapter。它的代码现在发布在上面。
  • 嘿,您在 getItem 方法中返回 null。
  • 是的,当没有正确选择任何选项卡时为 null。我无法重新选择选项卡(返回已选择并加载的选项卡)。我没有收到空指针异常。
  • 你为什么要把这段代码写得这么复杂你想做什么??
  • 我想在前后视图中的三个选项卡(它们是片段,每个都有不同的数据和布局)之间进行选择。
【解决方案2】:

这可能对你有帮助

viewPager.setAdapter(mAdapter);
viewPager.setOffscreenPageLimit(5); //this one.!

您可以有任何数量的限制,但由于内存自定义,最好使用低数量,在 oncreate() 方法中使用它(如果是 Activity)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多