天天看点

ActionBar结合Fragment实现Tab导航

第一步:给出布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:id="@+id/container">
</LinearLayout>
           

这个LinearLayout的作用是作为tab标签的内容显示页面

第二步:编写TabActivity,实现ActionBar.TabListener接口,代码如下:

public class TabActivity extends Activity implements ActionBar.TabListener{
    private final static String SELECTED_ITEM = "selected_item";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab);
        final ActionBar actionBar = getActionBar();
        //  actionBar设置导航模式
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        //  actionBar依次添加三个Tab标签  并为三个标签都添加监听器
        actionBar.addTab(actionBar.newTab().setText("第一页").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("第二页").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("第三页").setTabListener(this));
    }
    //  当指定的Tab被选择时执行这个方法
    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        Fragment fragment = new DummyFragment();
        Bundle args = new Bundle();
        args.putInt(DummyFragment.ARG_SECTION_NUMBER,tab.getPosition()+1);
        fragment.setArguments(args);
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.container,fragment);
        //  提交事务
        transaction.commit();
    }

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

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

    }
    //  将保存在Bundle数据中fragment的索引值取出来,恢复以前选择的tab页的内容
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if(savedInstanceState.containsKey(SELECTED_ITEM)){
            getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(SELECTED_ITEM));
        }
    }
    //  将当前fragment页的索引保存到Bundle中去
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(SELECTED_ITEM,getActionBar().getSelectedNavigationIndex());
    }
}
           

第三步:编写DummyFragment的代码:

public class DummyFragment extends Fragment{
    public final static String ARG_SECTION_NUMBER = "section_number";
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        TextView textView = new TextView(getActivity());
        textView.setGravity(Gravity.START);
        Bundle args = getArguments();
        textView.setText(args.getInt(ARG_SECTION_NUMBER)+"");
        textView.setTextSize(28);
        return textView;
    }
}
           

运行效果如下:

ActionBar结合Fragment实现Tab导航

注:ActionBar的这种导航方式从android 5.0后就不推荐使用,而推荐使用ActionBar上的图标导航