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
- android自定义Tabs控件,基于ScrollView+ViewPager实现。
- android开发游记:viewpager关联tabs,自定义tabs实现翻页滚动效果
- Android自定义LinearLayout实现左右侧滑菜单,完美兼容ListView、ScrollView、ViewPager等滑动控件
- Anroid自定义控件/ScrollView+ViewPager自定义控件
- Android自定义的轮播图控件,基于ViewPager
- 轻松实现 自定义slidingMenu+viewPager+scrollView
- 【Android自定义控件】不用ScrollView实现上下两屏滑动
- android scrollView 内嵌ViewPager或Gallery等水平滑动控件冲突问题解决实现同时滑动
- 复杂自定义控件---自定义ViewPager的实现
- 利用ScrollView实现阻尼弹簧自定义控件
- Android 自定义ViewPager 实现轮播图
- Android高级控件——GridView ScrollView ViewPager (上)
- 自定义控件:仿ViewPager实现左右滑动
- Android自定义控件系列六:自定义ViewGroup(一)实现ViewPager效果
- Android自定义控件系列六:自定义ViewGroup(一)实现ViewPager效果
- Android自定义控件系列五:自定义ViewGroup(一)实现ViewPager效果
- Android自定义控件系列六:自定义ViewGroup(一)实现ViewPager效果
- android scrollview viewpager 冲突
- 以后就不来光顾我们喽ss那个美女也嬉笑着说道
- MTK Launcher 应用的包名以及意图launcher.db
- android定制之自定义build.prop
- Android下如何自定义ProgressBar的外观
- 有关iOS GCD上的一些资料
- android自定义Tabs控件,基于ScrollView+ViewPager实现。
- 黑马程序员_Java基础篇(三)——抽象类和接口的对比
- Interesting Calculator
- TDD in ABAP开发(一:概念)
- 设计模块之简单工厂
- 前端技术Bootstrap的hello world
- ADT中显示中文乱码问题
- TDD in ABAP开发(二:程序例子)
- cocos2dx ActionManager动作管理