使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题。
我的问题原型:
这个问题,我相信遇到的人会比较少,我是在 一个 viewPager 中,其中 一个 fragment 中实现了长按滑动图片的功能,而发现它们两者的
onTouchEvent事件冲突。
尝试过的解决方法:
1-----
遇到这问题,首先是百度,百度到的方法有,自定义 viewPager,在里面重写 onTouchEvent 和 onInterceptTouchEvent,具体代码是下面,这种方法,我尝试
后发现,只能在第一次加载 viewPager的 页面达到 阻断的效果,我这里详细说下,在MainActivity 页面里面,我们初始化了 viewPager,然后我们要在 第二个页面的
fragment 中实现阻断,这时候,你可能会尝试 在 fragment 中new 一个 MainActivity 的对象,然后想方设法 获取它 里面的 viewPager,或者是 引入与 MainActivity
绑定好了的 xml文件,再 在 fragment 中 findViewById() 来获取次 viewPager。 然后使用 自定义 viewPager 里面的 函数。
很不幸,我上述谈到的方法,我都试过了, all failed。
2
3 /**
4 * Created by Administrator on 2015/5/30.
5 */
6 import android.content.Context;
7 import android.support.v4.view.ViewPager;
8 import android.util.AttributeSet;
9 import android.util.Log;
10 import android.view.MotionEvent;
11
12
13 public class myViewPager extends ViewPager {
14
15 private boolean enabled = true; // 默认是 可以侧滑的
16
17
18 public myViewPager(Context context, AttributeSet attrs) {
19 super(context, attrs);
20 }
21
22 public void setStopViewPagerSlip(boolean enabled){
23 this.enabled = enabled;
24 Log.i("--------------------","////"+this.enabled);
25 }
26 //触摸没有反应就可以了
27 @Override
28 public boolean onTouchEvent(MotionEvent event) {
29 if (this.enabled) {
30 return super.onTouchEvent(event);
31 }
32 return false;
33 }
34
35
36 @Override
37 public boolean onInterceptTouchEvent(MotionEvent event) {
38 if (this.enabled) {
39 return super.onInterceptTouchEvent(event);
40 }
41 return false;
42 }
43 }
2-----
第二种方法是我最后真正解决了的。刚开始的时候,使用有误,导致失败。
方法: view.requestDisallowInterceptTouchEvent(true); //传入参数是 true 即可
我第一次使用它失败的原因是:
在 我的 fragment中,由于 viewPager 它本是就是一个 view,所以 我使用 该方法的时候,就直接
viewPager .requestDisallowInterceptTouchEvent(true); 结果是失败的。 在子 view 中正确使用方法是 下面 ↓
解决方法:
view.requestDisallowInterceptTouchEvent(true);中使用的 view 要求是你当前 fragment 引入的xml 返回的 view,而且 改为:
view.getParent().requestDisallowInterceptTouchEvent(true);
此时方能真正解决! 下面 引入些必要的 代码。
本文链接:android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题,转载请注明。
工作中碰到一个问题,如何只修改文件中间的几个字节,而其他的内容不变。这个问题看似简单,但是很多人估计都不知道怎么做。我开始seek到文件的特定的位置,然后写文件,但是使用的文件打开模式不对,文件不是被清空,就是被截断,达不到效果。
fopen的打开模式
在C语言中文件打开方式有这么几种:
- r 以只读方式打开文件,只能读不能写,往文件中写是没有任何效果的
- r+ 可以读,也可以写,文件打开的时候,指向文件开头,可以通过seek改变读写位置
- w 这种方式打开的文件句柄,只能写,如果文件存在则将长度清零,否则新建文件,这种句柄通过seek之后,seek位置之前的文件数据全部变成0x00
- w+ 同w选项,只不过多了一个可读功能
- a 这种方式打开的文件,可以写,但是位置在文件末尾,即使往回seek也没有用,数据还是从文件末尾开始附加
- a+ 同a选项,多了可读的功能
另外还有2个选项,可以与上面的6个选项复合使用,一个是t表示以文本的方式打开文件(默认是t),一个是b表示以二进制的方式打开文件,t和b是互斥的不能同时使用。当与b组合时,有这么几种方式:wb、ab、rb、wb+、ab+、rb+,而a,w,r这几个选项是不能组合使用的,其中a,w都表示写文件,只不过一个在文件尾,一个在文件开始处,r表示读文件。我试过将a,w,r几个两两组合使用,发现下面的现象:
- wr 与w效果一样
- rw与r效果一样
- aw与a效果一样
- wa 与w效果一样
- ar与a效果一样
- ra与r效果一样
可以看出来当a,w,r在一起组合使用的时候,其后面的选项实际上好像是被忽略了
问题的解决方法:rb+打开文件
所以解决文章开头提出来的问题,应该使用 rb+ 的方式打开文件,这种方式打开的文件,可读,可写,打开之后写指针在文件开始处,可以任意seek,而seek之后写的内容会覆盖被写的内容,其他没有写到的内容不会有改变。
测试程序
#include <stdio.h>
#include <string.h>
int main()
{
//文件原始数据
//00 01 02 03 04 05 06 07 08 09
//下面每一个fopen前面注释中的数据是以该方式打开文件,写文件之后文件的内容
//00 00 00 00 CC DD
//FILE * file = fopen("./test.data","wb+");
//00 00 00 00 CC DD
//FILE * file = fopen("./test.data","wb");
//00 01 02 03 CC DD 06 07 08 09
FILE * file = fopen("./test.data","rb+"); //这种是正确的做法
//00 01 02 03 04 05 06 07 08 09
//FILE * file = fopen("./test.data","rb");
//00 01 02 03 04 05 06 07 08 09 CC DD
//FILE * file = fopen("./test.data","ab");
//00 01 02 03 04 05 06 07 08 09 CC DD
//FILE * file = fopen("./test.data","ab+");
//00 00 00 00 CC DD
//FILE * file = fopen("./test.data","wr");
//00 01 02 03 04 05 06 07 08 09
//FILE * file = fopen("./test.data","rw");
//00 01 02 03 04 05 06 07 08 09 CC DD
//FILE * file = fopen("./test.data","aw");
//00 00 00 00 CC DD
//FILE * file = fopen("./test.data","wa");
//00 01 02 03 04 05 06 07 08 09 CC DD
//FILE * file = fopen("./test.data","ar");
//00 01 02 03 04 05 06 07 08 09
//FILE * file = fopen("./test.data","ra");
if(file!=NULL)
{
char buffer[]={0xCC,0xDD};
fseek(file,4,SEEK_SET);
fwrite(buffer,1,sizeof(buffer),file);
fclose(file);
}
return 0;
}
本文链接:如何修改文件中间的几个字节,转载请注明。
没有评论:
发表评论