• 使用ActionBar实现Tab导航


         ActionBar还有常用的功能,实现Tab导航。ActionBar在顶端生成多个Tab标签,当用户单击点击某个Tab标签时,系统根据用户点击事件导航指定Tab页面。

         为了使用ActionBar实现Tab导航,按如下步骤进行即可。

         ①调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置使用Tab导航方式。

         ②调用ActionBar的addTab()方法添加多个Tab标签,并为每个Tab标签添加事件监听器。

        实际项目中为了更好的展现Tab导航效果,ActionBar通常会与Fragment结合使用,因此这里先简单介绍Fragment的用法。

        Fragment是Android 3.0新增的重要API,Fragment相当于Activity片段(Fragment本来就是片段的意思),我们通常使用单独的Activity组合多个Fragment,这样既可在一个Activity创建多个用户界面。除此之外,也可让多个Activity复用同一个Fragment。总之,Fragment相当于Activity的模块化区域。

       Fragment有自己的生命周期,它也可以接收、处理属于它自身的事件,并允许Activity运行期间动态地添加、删除Fragement。

       Fragement允许定义自己的布局,也可通过生命周期回调方法定义自己的行为,这一点Fragment非常像Activity。

       与开发Activity类似的是,开发者自定义的Fragment也需要继承Fragment,并重写它的生命周期方法,通常会重写Fragment的onCreateView()生命周期方法。

       实例:ActionBar结合Fragment实现Tab导航

       该实例的界面布局文件非常简单,该布局文件中只定义了一个简单的容器,该容器甚至没有太多要求,既可使用LinearLayout,也可使用RelativeLayout......甚至是普通ViewGroup即可,该容器只是用于盛装Fragment。该实例的界面布局文件如下。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       >
    </LinearLayout>

      上面的界面布局文件只是定义了一个LinearLayout作为容器,接下来Activity将会使用该容器动态盛装Fragment。下面是该Activity的代码。

    package org.crazyit.helloworld;
    
    import android.os.Bundle;
    import android.app.ActionBar;
    import android.app.ActionBar.Tab;
    import android.app.ActionBar.TabListener;
    import android.app.Activity;
    import android.app.Fragment;
    import android.app.FragmentTransaction;
    import android.view.Menu;
    
    public class ActionBar_TabNav extends Activity implements TabListener {
    
        private static final String SELECTED_ITEM="selected_item";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.action_bar__tab_nav);
            final ActionBar actionBar=getActionBar();
            //设置ActionBar的导航方式:Tab导航
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            //依次添加三个Tab页,并为三个Tab标签添加事件监听器
            actionBar.addTab(actionBar.newTab().setText("第一页").setTabListener(this));
            actionBar.addTab(actionBar.newTab().setText("第二页").setTabListener(this));
            actionBar.addTab(actionBar.newTab().setText("第三页").setTabListener(this));
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.action_bar__tab_nav, menu);
            return true;
        }
    
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            
            if(savedInstanceState.containsKey(SELECTED_ITEM))
            {
                //选中前面的索引对应的Fragment页
                getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(SELECTED_ITEM));
                
            }
        }
    
        
        
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            //将当前选中的Fragment页的索引保存到Bundle中
            outState.putInt(SELECTED_ITEM, getActionBar().getSelectedNavigationIndex());
            
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {
            // TODO Auto-generated method stub
            //创建一个新的Fragment对象
            Fragment fragment=new DummyFragment();
            //创建一个Bundle对象,用于向Fragment传入参数
            Bundle args=new Bundle();
            args.putInt(DummyFragment.ARG_SECTION_NUMBER, tab.getPosition()+1);
            //向fragment传入参数
            fragment.setArguments(args);
            //获取FragmentTransaction对象
            FragmentTransaction ft=getFragmentManager().beginTransaction();
            //使用fragment代替该Activity中的container组件
            ft.replace(R.id.container, fragment);
            //提交事务
            ft.commit();
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
            
        }
    
    }

      上面的第一段粗体字代码设置ActionBar使用Tab导航,为该ActionBar添加了三Tab标签,并为每个Tab标签都设置了事件监听器。

      当用户单击ActionBar的指定Tab标签时,系统将会激发该监听器的onTabSelected()方法,因此上面的第二段粗体字代码实现了onTabSelected()方法,并在该方法中根据用户选中的Tab标签替换新的Fragment。

      上面的实例用到了一个DummyFragment,这是一个简单的Fragemnt,它只是显示一个简单的TextView。下面是该DummyFragment的代码。

    package org.crazyit.helloworld;
    
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class DummyFragment extends Fragment {
    public static final 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);
        //获取创建该Fragment时传入的参数Bundle
        Bundle args=getArguments();
        //设置TextView显示的文本
        textView.setText(args.getInt(ARG_SECTION_NUMBER)+"");
        textView.setTextSize(30);
        //返回TextView
        return textView;
        // TODO Auto-generated method stub
        //return super.onCreateView(inflater, container, savedInstanceState);
    }
    
    
    }

    运行该实例看到如图所示效果。

  • 相关阅读:
    CSS教程:div垂直居中的N种方法
    .NET中Flags枚举的使用
    C# 两种方法实现HTTP协议迷你服务器
    百度面试题:求绝对值最小的数
    单点登录
    三范式
    hibernate cascade
    debugview trace 调试
    面向模式的软件体系结构
    待研究
  • 原文地址:https://www.cnblogs.com/wolipengbo/p/3400349.html
Copyright © 2020-2023  润新知