第一个,每次点击新闻中心,都自动弹出侧边栏,是因为上面有一个button,点击也能出侧边栏,之前测试的时候在新闻中心的代码里调用了他,故而每次进来都自动弹出
//响应侧边栏的点击事件,显示具体的内容
public void setCurrentMenuDetailPager(int position) {
//在这个pager里面的flcontent(帧布局)里面增加一个布局
BaseMenuDetailPager baseMenuDetailPager = mPagers.get(position);
flContent.removeAllViews();// 清除之前的布局
flContent.addView( baseMenuDetailPager.mRootView);
baseMenuDetailPager.initData();// 初始化当前页面的数据
/*//点击button弹出侧边栏,在base里实现,都能用,测试用的,应该注释掉,否则点新闻中心自动弹出
toggleSlidingMenu();*/
}
/*
* toggle函数,当前状态是显示,则调用后会不显示,当前不显示,则调用后会显示
* toggle无需参数
*/
protected void toggleSlidingMenu() {
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
slidingMenu.toggle();
}
第二个问题,scrollView的问题,对于小标题栏的新闻,里面有一个viewpager,每次划完topicnews,应该能滑到下一个栏目,比如从北京的最后一个滑到中国,或者从北京往右滑,能把侧边栏划出来。
这就要考虑onTouch事件
最里面的topicnews滑到头了,应该把touch事件交给上一层的viewpager来处理,他有12个子栏目
完善之前的TopNewsViewPager
重写dispatchTouchEvent
首选要判断左右移动(后面还有下拉刷新),需要坐标,左右坐标变动比上下变大动,其中的raw指的是绝对坐标,在整个屏幕来说的
public class TopNewsViewPager extends ViewPager{
int startX;
int startY;
public TopNewsViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public TopNewsViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:// 不要拦截,这样是为了保证ACTION_MOVE调用
getParent().requestDisallowInterceptTouchEvent(true);
System.out.println("TopNewsViewPager.dispatchTouchEvent() ACTION_DOWN");
startX = (int) ev.getRawX();
startY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
System.out.println("TopNewsViewPager.dispatchTouchEvent() ACTION_MOVE");
int endX = (int) ev.getRawX();
int endY = (int) ev.getRawY();
System.out.println("TopNewsViewPager.dispatchTouchEvent() + dx"+Math.abs(endX - startX)+"dy"+ Math.abs(endY - startY));
if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑动
System.out.println("TopNewsViewPager.dispatchTouchEvent() endx"+ endX + "startx"+startX +"cu:"+ getCurrentItem());
if (endX > startX) {// 右划
if (getCurrentItem() == 0) {// 第一个页面, 需要父控件拦截
System.out
.println("TopNewsViewPager.dispatchTouchEvent() 右滑 getCurrentItem() == 0"+ getChildCount());
getParent().requestDisallowInterceptTouchEvent(false);
}
} else {// 左划
if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一个页面,
getParent().requestDisallowInterceptTouchEvent(false);// 需要拦截
}
}
} else {// 上下滑动
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}
还是这里,另一个问题,从中国切回北京,在北京的topicnews里,往左滑能进中国了,但是往右滑却直接打开侧边栏了,按之前写的,只有第0个item时才给父控件,现在却没能屏蔽父控件,这里根据打的trace,这里确实屏蔽了,说明这个类里没问题,问题在别的地方,上一级,newsMenuDetail的viewPager,canscroll里面
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getCurrentItem() != 0) {
getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求,不拦截
} else {// 如果是第一个页面,需要显示侧边栏, 请求父控件拦截
getParent().requestDisallowInterceptTouchEvent(false);// 拦截
}
return super.dispatchTouchEvent(ev);
}
这里的意思是第一个栏目,北京的时候,交给父控件处理了,这样activity直接把侧边栏拉出来了,这样两者就冲突了,父盖了子~
这里有两个解法
首先是去掉else这一部分,如果设置false的话它会第一时间拦截,而如果不设的话它就会默认等ViewPager划到第一个页面才拦截
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getCurrentItem() != 0) {
getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求,不拦截
} /*else {// 如果是第一个页面,需要显示侧边栏, 请求父控件拦截
getParent().requestDisallowInterceptTouchEvent(false);// 拦截
} */
return super.dispatchTouchEvent(ev);
}
另一个解法,这里整个都不要了,直接在布局里声明viewpager,不要继承
这样又回到之前要解决的问题,第一个子栏目能够把侧边栏拖出来
侧边栏的点击mode,响应区域,只有首个栏目才有,别的设为none,有同样的效果,需要listener,直接在类上面实现,下面重载方法
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
System.out.println("onPageSelected:" + position);
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
if (position == 0) {//只有在第一个页面(北京), 侧边栏才允许出来
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
} else {
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}