关闭

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

标签: 安卓
247人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37060次
    • 积分:1079
    • 等级:
    • 排名:千里之外
    • 原创:70篇
    • 转载:13篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论