[安卓]新闻客户端(七) 一些bug~

第一个,每次点击新闻中心,都自动弹出侧边栏,是因为上面有一个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
		
	}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值