ActionBar(6) ActionBar+ViewPager 实现可左右滑动的Tab页布局

   

  利用ActionBar+ViewPager实现可左右滑动的Tab页布局。


    可左右滑动的Tab页布局的好处在于,用单手左右滑动操作即可,而无须去点击切换Tab页。


效果如下:

  



     

实现步骤如下:

   1. 在XML布局文件中指定ViewPager。

<?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="vertical" >
    
        <android.support.v4.view.ViewPager
        android:id="@+id/vPager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1.0"
        android:background="#000000"
        android:flipInterval="30"
        android:persistentDrawingCache="animation" />
        

</LinearLayout>

2.  直接上代码

工程中 ActionBarActivity 引用自android-support-v7-appcompat扩展包。
  具体引用方法可参考点击打开链接


public class TabBar3Activity extends ActionBarActivity{

	private ActionBar actionBar;
	private ViewPager mPager;
	private ArrayList<View> mViews = null;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabbar);
        //得到Bar
        actionBar = getSupportActionBar();
        
        //设置标题
        actionBar.setTitle("ActionBar+ViewPager");
        actionBar.setSubtitle("努力!");
        
        //实现用户点击ActionBar 图标后返回前一个activity
        actionBar.setDisplayHomeAsUpEnabled(true) ;
               
        //定义ActionBar模式为NAVIGATION_MODE_TABS
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);      
        actionBar.addTab(actionBar.newTab()
        		.setText("t1")
        		.setIcon(R.drawable.ic_launcher)
        		.setTabListener(MyBarTabListener));
             
        actionBar.addTab(actionBar.newTab()
        		.setText("t2")
        		.setIcon(R.drawable.ic_launcher)
        		.setTabListener(MyBarTabListener));
        
        mPager = (ViewPager)findViewById(R.id.vPager);
                
        /*---------------------------------------------------------------------------
        	方法一:*/
        /*
         * 
         *  LayoutInflater  用于找layout下xml布局文件,并且实例化
         *  而findViewById()是找xml下具体的widget控件
         *  所以这两个作用应用场景分别如下 :
         * 	 1.对于没有被载入或想要动态载入的界面,都需要inflate来载入
         *   2.对于一个已经载入的Activity,则可以用 findViewById()来获得界面控制元素
         */
    
        //将要分页显示的View装入数组中
        LayoutInflater layFlater = LayoutInflater.from(this);
        View view1 = layFlater.inflate(R.layout.activity_tabbar_page1, null);
	    View view2 = layFlater.inflate(R.layout.activity_tabbar_page2, null);
	    
	    //每个页面的Title数据
        mViews = new ArrayList<View>();
        mViews.add(view1);
        mViews.add(view2);
        mPager.setAdapter(MyPagerAdapter);
      
        mPager.setOnPageChangeListener(new MyPageScrollEvent());      
        mPager.setCurrentItem(0);
    }


    @SuppressLint("NewApi") @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
    	//添加菜单项  
        MenuItem findItem = menu.add(0,1,0,"查找");  
        MenuItem exitItem = menu.add(0,0,0,"退出"); 
        
        //绑定到ActionBar    
        findItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);  
        exitItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);  
        
        return true;
    }
    
    
    /**
     * ActionBar上的Tab页更改
     * http://developer.android.com/reference/android/app/ActionBar.TabListener.html
		Public Methods
			onTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
				Called when a tab that is already selected is chosen again by the user.
			
			onTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
				Called when a tab enters the selected state.
			
			onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
				Called when a tab exits the selected state.
     */       
    private final TabListener MyBarTabListener = new TabListener(){
    	private final static String TAG = "MyBarTabListener";
        
		@Override
		public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
			// TODO Auto-generated method stub
			Log.d(TAG,"onTabReselected");
		}
		@Override
		public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
			// TODO Auto-generated method stub
			Log.d(TAG,"onTabSelected");
			//当更改ActionBar上的Tab页有更改时,ViewPager显示相关的页面
			if (mPager != null)  
				mPager.setCurrentItem(arg0.getPosition());
		}
		@Override
		public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
			// TODO Auto-generated method stub
			Log.d(TAG,"onTabUnselected");
		}
    };
    
    /**
     * 填充ViewPager的数据适配器
     */
    private final PagerAdapter MyPagerAdapter = new PagerAdapter() {
		
		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}
		
		@Override
		public int getCount() {
			return mViews.size();
		}

		@Override
		public void destroyItem(View container, int position, Object object) {
			((ViewPager)container).removeView(mViews.get(position));
		}

		//@Override
		//public CharSequence getPageTitle(int position) {
			//return titles.get(position); 
		//}

		@Override
		public Object instantiateItem(View container, int position) {
			((ViewPager)container).addView(mViews.get(position));
			return mViews.get(position);
		}
	};
	
    
    /**
     * 用于ViewPager滑动时触发.
     * 
     * http://docs.eoeandroid.com/reference/android/support/v4/view/ViewPager.OnPageChangeListener.html
	 onPageScrollStateChanged(int state)
		Called when the scroll state changes.
		
	 onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
			This method will be invoked when the current 
			page is scrolled, either as part of a programmatically initiated 
			smooth scroll or a user initiated touch scroll.
			
	 onPageSelected(int position)
			This method will be invoked when a new page becomes selected.
     */    
    class MyPageScrollEvent implements OnPageChangeListener
    {
    	private final static String TAG = "MyPageScrollEvent";
		@Override
		public void onPageScrollStateChanged(int arg0) {
			// TODO Auto-generated method stub
			Log.d(TAG,"onPageScrollStateChanged");
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			// TODO Auto-generated method stub
			Log.d(TAG,"onPageScrolled");
		}

		@Override
		public void onPageSelected(int arg0) {
			// TODO Auto-generated method stub
			Log.d(TAG,"onPageSelected");
			//当滑动ViewPager 换页时,将ActionBar上的Tab显示到对应页
			actionBar.selectTab(actionBar.getTabAt(arg0));
		}    	
    }
    
    
    /**
     * 菜单事件响应
     */
    public boolean onOptionsItemSelected(MenuItem item) {  
        // TODO Auto-generated method stub  
        switch (item.getItemId()) {         
        case 0:  
        	//displayToast("退出菜单");
        	break;
        case 1:  
        	//displayToast("查找菜单");
        	break;
        case android.R.id.home:  

            Intent intent = new Intent(this, MainActivity.class);  
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP  
                    | Intent.FLAG_ACTIVITY_NEW_TASK);  
            startActivity(intent);  
            Toast.makeText(getApplicationContext(), "android.R.id.home", 0)  
                    .show();  
            break;  
        default:  //action_compose
            break;  
        }  
        return super.onOptionsItemSelected(item);  
    }  
    
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值