带有3个选项卡的ActionBar compact:片段问题

时间:2014-05-21 22:08:43

标签: android android-fragments tabs android-actionbar-compat

我目前正在开发一个新的Android项目。

我正在ActionBar Compact使用Tab navigation mode

我在我的活动中添加了3 tabs

在第一个片段中,有一个listView和TextView(包含选定行列表的文本)

现在,当我选择第二个标签(片段(空)),并返回到我的第一个片段时,TextView包含所选的值  但是当我选择第三个标签(片段3为空),并回到我的第一个fragent时,TextView被启动了。 我认为我的问题出现在TabListener

任何人都可以帮助我! 这是代码(简化)

MainActivity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /** Getting a reference to action bar of this activity */
        mActionbar = getSupportActionBar();     

        /** Set tab navigation mode */
        mActionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        /** set HomeButton to true */
        mActionbar.setHomeButtonEnabled(true);

        /** Getting a reference to ViewPager from the layout */
        mPager = (ViewPager) findViewById(R.id.pager);

        /** Getting a reference to FragmentManager */
        FragmentManager fm = getSupportFragmentManager();

        /** Defining a listener for pageChange */
        ViewPager.SimpleOnPageChangeListener pageChangeListener = new ViewPager.SimpleOnPageChangeListener(){
                @Override
                public void onPageSelected(int position) {
                        super.onPageSelected(position);
                        mActionbar.setSelectedNavigationItem(position);
                }

        };

        /** Setting the pageChange listener to the viewPager */
        mPager.setOnPageChangeListener(pageChangeListener);

        /** Creating an instance of FragmentPagerAdapter */
        MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(fm);

        /** Setting the FragmentPagerAdapter object to the viewPager object */
        mPager.setAdapter(fragmentPagerAdapter);

        mActionbar.setDisplayShowTitleEnabled(true);

        /** Defining tab listener */
        ActionBar.TabListener tabListener = new ActionBar.TabListener() {

                        @Override
                        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                        }

                        @Override
                        public void onTabSelected(Tab tab, FragmentTransaction ft) {
                                mPager.setCurrentItem(tab.getPosition());

                        }

                        @Override
                        public void onTabReselected(Tab tab, FragmentTransaction ft) {
                        }
                };

                /** Creating fragment1 Tab */
                Tab tab = mActionbar.newTab()
                                   .setText("Categories")                                   
                                   .setTabListener(tabListener);

                mActionbar.addTab(tab, 0, false);

                /** Creating fragment2 Tab */
                tab = mActionbar.newTab()
                               .setText("Acceuil")                               
                               .setTabListener(tabListener);

                mActionbar.addTab(tab, 1, true);  
                /** Creating fragment3 Tab */
                tab = mActionbar.newTab()
                               .setText("Services")                               
                               .setTabListener(tabListener);

                mActionbar.addTab(tab, 2, false);       


    }

片段2:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        categories = inflater.inflate(R.layout.fragment_categories, container, false);
         list= (ListView)categories.findViewById(R.id.listCategories);
          // Defined Array values to show in ListView
         String[] values = new String[] { "Android List View", 
                                          "Adapter implementation",
                                          "Simple List View In Android",
                                          "Create List View Android", 
                                          "Android Example", 
                                          "List View Source Code", 
                                          "List View Array Adapter", 
                                          "Android Example List View" 
                                         };

         ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),android.R.layout.simple_list_item_1, android.R.id.text1, values);
         // Assign adapter to ListView
         list.setAdapter(adapter); 
        t =(TextView)categories.findViewById(R.id.textView1);
         list.setOnItemClickListener(new OnItemClickListener()
         {
             public void onItemClick(AdapterView<?> parent,View v, int position, long id)
          {
                 Toast.makeText(getActivity().getBaseContext(),"category " + (position + 1) +" selected",Toast.LENGTH_SHORT).show();
                    t.setText("category " + (position + 1) +" selected");


           }
         });
        return categories;
    }

截图

当我从listView(片段1)中选择行时==&gt;片段2 ==&gt;回到片段1

enter image description here

当我从listView(片段1)中选择行时==&gt;片段3 ==&gt;回到片段1

enter image description here

2 个答案:

答案 0 :(得分:5)

在主要活动的onCreate()中,初始化ViewPager后,添加:

mPager.setOffscreenPageLimit(2);

根据Android docssetOffscreenPageLimit()

  

设置在空闲状态下视图层次结构中应保留到当前页面任一侧的页面数。超出此限制的页面将在需要时从适配器重新创建。

     

这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上使用延迟加载机制,那么调整此设置可以获得分页动画和交互的感知平滑性。如果您有少量页面(3-4)可以一次保持活动状态,那么当用户来回翻页时,新创建的视图子树的布局花费的时间会更少。

     

您应该将此限制保持在较低水平,尤其是在您的网页布局复杂的情况下。此设置默认为1.

由于默认设置为1,因此当您在第一个选项卡上启动并导航到第三个选项卡时,导航回第一个选项卡时将重新创建第一个页面(即片段)。将此值设置为2即使导航到第三个选项卡,也应将片段保留在第一个选项卡中。

答案 1 :(得分:0)

尝试在片段

中使用setRetainInstance()
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

这样,您的片段实例不会被破坏,只会破坏其视图层次结构。