事件拦截,父控件不拦截子控件
/** * 不允许滑动的ViewPager */ public class NoScrollViewPager extends ViewPager { public NoScrollViewPager(Context context) { super(context); } public NoScrollViewPager(Context context, AttributeSet attrs) { super(context, attrs); } // 事件拦截 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return false;// 不拦截子控件的事件 } @Override public boolean onTouchEvent(MotionEvent ev) { return true; } }
开源框架ViewPagerIndicator
首先在NewsMenuDetailPager的布局文件中将TabPageIndicator布局上
<?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"> <com.viewpagerindicator.TabPageIndicator android:id="@+id/indicator" android:layout_width="match_parent" android:layout_height="wrap_content"></com.viewpagerindicator.TabPageIndicator> <android.support.v4.view.ViewPager android:id="@+id/vp_news_menu_detail" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"></android.support.v4.view.ViewPager> </LinearLayout>
初始化
mIndicator
@Override public View initView() { View view = View.inflate(mActivity, R.layout.pager_news_menu_detail, null); mViewPager = (ViewPager) view.findViewById(R.id.vp_news_menu_detail); mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator); return view; }
将viewpager和指示器绑定在一起,必须在viewpager数据设置完毕之后
/** * 初始化页签,根据网络返回的数据 */ @Override public void initData() { mPagers = new ArrayList<>();Z for (int i = 0; i < mTabData.size(); i++) { TabDetailPager pager = new TabDetailPager(mActivity, mTabData.get(i)); mPagers.add(pager); } mViewPager.setAdapter(new NewsMenuDetailAdapter()); mIndicator.setViewPager(mViewPager);//将viewpager和指示器绑定在一起,必须在viewpager数据设置完毕之后 }
在
PagerAdapter
中重写
getPageTitle 方法
/** * 制定指示器的标题 * @param position * @return */ @Override public CharSequence getPageTitle(int position) { NewsMenu.NewsTabData data = mTabData.get(position); return data.title; }
给MainActivity设置一个主题
<activity android:name="activities.MainActivity" android:theme="@style/Theme.PageIndicatorDefaults" />
原生背景是黑色的.
可以在MainActivity中将背景再设置成白色
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fl_main" android:background="#FFF" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout>
/** * 新闻菜单详情页 * ViewwPagerIndicator使用流程 * 1.引入库 * 2.解决support-v4冲突 * 3.从例子程序中拷贝布局文件 * 4.从例子程序中拷贝相关代码(指示器和viewpager绑定;重写getPageTitle返回标题) * 5.在清单文件中增加样式 * 6.背景修改为白色 * 7.修改引入库中的样式来设置文字颜色,标签样式等 */
// 事件分发 @Override public boolean dispatchTouchEvent(MotionEvent ev) { // 请求所有父控件及祖宗控件不要拦截事件 getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); }
// 事件分发 @Override public boolean dispatchTouchEvent(MotionEvent ev) { // 请求所有父控件及祖宗控件不要拦截事件 getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); }