您的位置:首页 > 其它

ActionBar和Fragment结合ViewPager实现TabActivity

2014-04-09 17:27 351 查看
创建FragmentActivity,总的代码如下:

[java] view
plaincopy

package com.example.fragmenttest;  

  

import android.app.ActionBar;  

import android.app.ActionBar.Tab;  

import android.app.ActionBar.TabListener;  

import android.os.Bundle;  

import android.support.v4.app.FragmentActivity;  

import android.support.v4.view.ViewPager;  

import android.support.v4.view.ViewPager.OnPageChangeListener;  

import android.util.Log;  

import android.view.Menu;  

  

public class MainActivity extends FragmentActivity {  

  

    public final static int TAB_INDEX_TAB_1 = 0;  

    public final static int TAB_INDEX_TAB_2 = 1;  

    public final static int TAB_INDEX_TAB_3 = 2;  

    public final static int TAB_INDEX_TAB_4 = 3;  

    public final static int TAB_COUNT = 4;  

  

    private ViewPager mViewPager;  

  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

  

        // 创建Tab  

        setupTest1();  

        setupTest2();  

        setupTest3();  

        setupTest4();  

        getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  

        getActionBar().setDisplayShowTitleEnabled(false);  

        getActionBar().setDisplayShowHomeEnabled(false);  

  

        // 创建 view pager  

        mViewPager = (ViewPager)findViewById(R.id.pager);  

        getFragmentManager();  

  

        mViewPager.setAdapter(new TestViewPagerAdapter(getSupportFragmentManager()));  

        mViewPager.setOnPageChangeListener(new TestPagerListener());  

        mViewPager.setCurrentItem(TAB_INDEX_TAB_2);  

    }  

  

    private void setupTest1(){  

        Tab tab = this.getActionBar().newTab();  

        tab.setContentDescription("Tab 1");  

        tab.setText("Tab 1");  

        tab.setTabListener(mTabListener);  

        getActionBar().addTab(tab);  

    }  

  

    private void setupTest2(){  

        Tab tab = this.getActionBar().newTab();  

        tab.setContentDescription("Tab 2");  

        tab.setText("Tab 2");  

        tab.setTabListener(mTabListener);  

        getActionBar().addTab(tab);  

    }  

  

    private void setupTest3(){  

        Tab tab = this.getActionBar().newTab();  

        tab.setContentDescription("Tab 3");  

        tab.setText("Tab 3");  

        tab.setTabListener(mTabListener);  

        getActionBar().addTab(tab);  

    }  

  

    private void setupTest4(){  

        Tab tab = this.getActionBar().newTab();  

        tab.setContentDescription("Tab 4");  

        tab.setText("Tab 4");  

        tab.setTabListener(mTabListener);  

        getActionBar().addTab(tab);  

    }  

  

    @Override  

    public boolean onCreateOptionsMenu(Menu menu) {  

        getMenuInflater().inflate(R.menu.activity_main, menu);  

        return true;  

    }  

  

    private final TabListener mTabListener = new TabListener() {  

        private final static String TAG = "TabListener";  

        @Override  

        public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {  

            // TODO Auto-generated method stub  

            Log.d(TAG, "onTabReselected");  

        }  

  

        @Override  

        public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {  

            // TODO Auto-generated method stub  

            Log.d(TAG, "onTabSelected()");  

            if (mViewPager != null)  

                mViewPager.setCurrentItem(tab.getPosition());  

        }  

  

        @Override  

        public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {  

            // TODO Auto-generated method stub  

            Log.d(TAG, "onTabUnselected()");  

        }  

    };  

  

    class TestPagerListener implements OnPageChangeListener{  

        @Override  

        public void onPageScrollStateChanged(int arg0) {  

            // TODO Auto-generated method stub  

        }  

  

        @Override  

        public void onPageScrolled(int arg0, float arg1, int arg2) {  

            // TODO Auto-generated method stub  

        }  

  

        @Override  

        public void onPageSelected(int arg0) {  

            getActionBar().selectTab(getActionBar().getTabAt(arg0));  

        }  

    }  

}  

setupTab*展示了如何获取ActionBar,如何创建和添加Tab组件到ActionBar中。

注意setTabListener这个接口,我们是必须设的,否则要报错,在看一下TabListener的实现,我们只在onTabSelected中写了一句代码,就是要求ViewPager显示出对应位置的Fragment。

oncreate 中的NAVIGATION_MODE_TABS定义了ActionBar的模式,后面两名是隐藏Tilte bar。

 

ViewPager是一个容器,用来放Fragment,我们需要在FragmentActivity中添加它,我加在layout文件中的:

[html] view
plaincopy

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  

    xmlns:tools="http://schemas.android.com/tools"  

    android:layout_width="match_parent"  

    android:layout_height="match_parent" >  

    <com.example.fragmenttest.TestViewPage  

        android:id="@+id/pager"  

        android:layout_width="match_parent"  

        android:layout_height="match_parent"  

        />  

</RelativeLayout>  

TestViewPager是ViewPager的一个子类,实现代码如下:

[java] view
plaincopy

package com.example.fragmenttest;  

  

import android.content.Context;  

import android.support.v4.view.ViewPager;  

import android.util.AttributeSet;  

  

public class TestViewPage extends ViewPager{  

      

    public TestViewPage(Context context) {  

        super(context);  

    }  

  

    public TestViewPage(Context context, AttributeSet attrs) {  

        super(context, attrs);  

    }  

}  

 

再看一下getFragmentManager()和getSupportFragmentManager()这两个接口,它们的区别是,前者调用Android框架的FragmentManger,后者是获取Android扩展库中的V4的Support FragmentManager,着为独立的APP只能用后者,原因android.jar包中没有前者的实现。

我们再看看TestViewPagerAdapter的代码:

[java] view
plaincopy

package com.example.fragmenttest;  

  

import android.support.v4.app.Fragment;  

import android.support.v4.app.FragmentManager;  

import android.support.v4.app.FragmentPagerAdapter;  

  

public class TestViewPagerAdapter extends FragmentPagerAdapter {  

  

    public TestViewPagerAdapter(FragmentManager fm) {  

        super(fm);  

        // TODO Auto-generated constructor stub  

    }  

  

    @Override  

    public Fragment getItem(int arg0) {  

        // TODO Auto-generated method stub  

        switch (arg0) {  

        case MainActivity.TAB_INDEX_TAB_1:  

            return new Tab1Fragment();  

  

        case MainActivity.TAB_INDEX_TAB_2:  

            return new Tab2Fragment();  

  

        case MainActivity.TAB_INDEX_TAB_3:  

            return new Tab3Fragment();  

  

        case MainActivity.TAB_INDEX_TAB_4:  

            return new Tab4Fragment();  

        }  

  

        throw new IllegalStateException("No fragment at position " + arg0);  

    }  

  

    @Override  

    public int getCount() {  

        // TODO Auto-generated method stub  

        return MainActivity.TAB_COUNT;  

    }  

}  

其实这个类就是关联ViewPager和Fragment,注意这些Index。

可能有的同学还是想看一下Fragment的实现:

[java] view
plaincopy

package com.example.fragmenttest;  

  

import android.os.Bundle;  

import android.support.v4.app.Fragment;  

import android.view.LayoutInflater;  

import android.view.View;  

import android.view.ViewGroup;  

  

public class Tab1Fragment extends Fragment {  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        // TODO Auto-generated method stub  

        super.onCreate(savedInstanceState);  

    }  

      

    @Override  

    public View onCreateView(LayoutInflater inflater, ViewGroup container,  

            Bundle savedInstanceState) {  

        View fragmentView = inflater.inflate(R.layout.tab1_fragment_layout, container, false);  

        return fragmentView;  

    }  

}  

至于里面的layout就随便放了。

 

我们再回到FragmentActivity的onCreate, 我们看一下OnPageChangeListener,比较关键的就是onPageSelected里面的这句代码,它是实现Page切换时Tab也会切换,否则Tab和Fragment动作不一致。

 

很简单的一篇文章,对还没有理解到这种流程的同学提供一点帮助。

最后上个效果图吧!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: