android自定义Tabs控件,基于ScrollView+ViewPager实现。

来源:互联网 发布:手机淘宝联盟怎样提现 编辑:程序博客网 时间:2024/06/14 17:24

实现效果如图所示


点击上面的Tabs可以切换下面的Page,同样滑动下面的Page可以让上面的tabs自动切换。

一,ScrollView

主要是继承一个HorizontalScrollView,然后构造一个LinearLayout,在里面添加Button实现选项卡。选中后设置当前选中的按钮和Page。

package com.widgets;import com.adapters.TabAdapter;import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.View;import android.widget.HorizontalScrollView;import android.widget.LinearLayout; public class ScrollTabView extends HorizontalScrollView implements ViewPager.OnPageChangeListener{private TabAdapter tabAdapter; private Context mContext;private LinearLayout container;private ViewPager viewPager;public ScrollTabView(Context context) {this(context,null);// TODO Auto-generated constructor stub}public ScrollTabView(Context context, AttributeSet attrs) {this(context, attrs,0);// TODO Auto-generated constructor stub}public ScrollTabView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubmContext=context;container=new LinearLayout(mContext);container.setOrientation(LinearLayout.HORIZONTAL);addView(container);}public TabAdapter getAdapter() {return tabAdapter;}public void setAdapter(TabAdapter tabAdapter) {this.tabAdapter = tabAdapter;initTabs();}public void setViewPager(ViewPager viewPager){this.viewPager=viewPager;viewPager.setOnPageChangeListener(this);}private void initTabs(){ for(int i=0;i<tabAdapter.getCount();i++){ final int position=i; View tab=tabAdapter.getView(i); container.addView(tab);   tab.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubselectedTab(position);viewPager.setCurrentItem(position);}  }); }   //默认选中0 selectedTab(0);}public void selectedTab(int position){for(int i=0;i<container.getChildCount();i++){container.getChildAt(i).setSelected(position==i);}int w=container.getChildAt(0).getWidth();smoothScrollTo(w*(position-1), 0);//不用考虑position=0,scrollTo(-x,0)相当于scrollTo(0,0)滚动不会超过视图边界}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageSelected(int position) {// TODO Auto-generated method stubselectedTab(position);}}

1,抽象类TabAdapter

维护一个保存选项卡名的List

package com.adapters;import java.util.ArrayList;import java.util.List;import android.view.View;public abstract class TabAdapter {List<String> tabsList=new ArrayList<String>();public abstract  View getView(int position);public int getCount(){return tabsList.size();}public void add(String name){tabsList.add(name);} }

2,ScrollTabsAdapter

构造选项卡视图的适配器

package com.adapters;   import com.activities.R;import android.app.Activity;import android.content.Context;import android.util.DisplayMetrics;import android.view.LayoutInflater;import android.view.View;import android.widget.Button;public class ScrollTabsAdapter extends TabAdapter {private Activity activity;DisplayMetrics dm;public ScrollTabsAdapter(Activity activity) {super();// TODO Auto-generated constructor stubthis.activity=activity;dm = new DisplayMetrics();activity.getWindowManager().getDefaultDisplay().getMetrics(dm);}@Overridepublic View getView(int position) {// TODO Auto-generated method stubLayoutInflater inflater=(LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);Button button=(Button) inflater.inflate(R.layout.tabs, null); button.setWidth(dm.widthPixels/3); //设置button宽度为屏幕宽度的1/3button.setText(tabsList.get(position));return button;}}


MainActivity


 package com.activities; import com.adapters.PagerAdapter;import com.adapters.ScrollTabsAdapter;import com.adapters.TabAdapter;import com.fragments.MyFragment;  import com.widgets.ScrollTabView;import android.content.Context;import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.support.v4.view.ViewPager;public class MainActivity extends FragmentActivity {private ScrollTabView scrollTabsView;private TabAdapter tabsAdapter;private ViewPager viewPager;private Context context;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_main);context=getBaseContext();initTabs();initViewPager();}void initTabs(){scrollTabsView= (ScrollTabView) findViewById(R.id.tabs);tabsAdapter=new ScrollTabsAdapter(this);tabsAdapter.add("最近");tabsAdapter.add("歌曲");tabsAdapter.add("艺术家");tabsAdapter.add("专辑");tabsAdapter.add("播放列表");tabsAdapter.add("流派");scrollTabsView.setAdapter(tabsAdapter);}void initViewPager(){viewPager=(ViewPager) findViewById(R.id.viewpager);PagerAdapter pagerAdapter=new PagerAdapter(getSupportFragmentManager());MyFragment f1=new MyFragment("最近");pagerAdapter.addFragment(f1);MyFragment f2=new MyFragment("歌曲");pagerAdapter.addFragment(f2);MyFragment f3=new MyFragment("艺术家");pagerAdapter.addFragment(f3);MyFragment f4=new MyFragment("专辑");pagerAdapter.addFragment(f4);MyFragment f5=new MyFragment("播放列表");pagerAdapter.addFragment(f5);MyFragment f6=new MyFragment("流派");pagerAdapter.addFragment(f6);viewPager.setAdapter(pagerAdapter);scrollTabsView.setViewPager(viewPager);}}


 http://download.csdn.net/detail/huweigoodboy/8009433

0 0