1.Frament
使用静态的时候在布局中必须给fragment加id
否则报错
2.在使用
BridgeWebView时候安卓js双方都得初始化
无论怎样形式的交互,Js 必须要初始化jsBridge
bridge.init(function(message, responseCallback) {
console.log('JS got a message', message);
var data = {
'Javascript Responds': '测试中文!'
};
console.log('JS responding with', data);
responseCallback(data);
});
3.在使用序列化存储,修改对象属性步骤
修改对象属性值的时候先反序列化得到原来对象,然后给对象属性重新赋值 ,再存储该对象,这样才能成功存储进去
直接new对象存储是错误的
序列化是以文件形式存储二进制,使用ObjectOutputStream写入,用ObjectInputStream读取
当写入对象的时候,对象写入流会在开头和结尾添加AC/DC
必须用同一个对象写入流写入,因为在对象写入流close的时候会添加DC
,再次写入另外一些对象的时候DC也不会消失,所以当读取的时候就会出现错误!
测试一,错的的将新创建的对象写入,以为可以覆盖
public class SerializabileText {
public static void main(String[] args) {
File file = new File("d:\\a\\Object.txt");
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
People peo = new People("张三",18);
oos.writeObject(peo);//将类写入一个Object.txt中
People peo1 = new People("李四",16);
oos.writeObject(peo1);//本想写入新的People覆盖原来的对象,达到修改效果
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));//用来读取对象
People people = (People) ois.readObject();//根据写入的Object.txt文件已经存储的对象并强转
System.out.println(people.name+people.age);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果 张三18
还是最初的值并没有修改
测试2 正确修改
public class SerializabileText {
public static void main(String[] args) {
File file = new File("d:\\a\\Object.txt");
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
People peo = new People("张三",18);
oos.writeObject(peo);//将类写入一个Object.txt中
//People peo1 = new People("李四",16);
//oos.writeObject(peo1);//打算写入新的People覆盖
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));//用来读取对象
People people = (People) ois.readObject();//根据写入的Object.txt文件已经存储的对象并强转
people.setAge(19);//给已经原对象重新赋值
people.setName("李四");
oos.writeObject(peo);
System.out.println(people.name+people.age);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出 李四19
修改正确
4。当用Intent.getFloatExtra();时要注意在Inteng.putExtra()时候 如果是小数默认为Double类型,注意转成float类型再发送
5.网络请求遇到问题:手机端和浏览器 url一样返回数据不同:
问题所在 一,手机端url是不是有多余的空格,去掉再试试
二.手机端请求网络框架设置了缓存,当请求url相同时候,手机端不会去访问网络,直接调用之前相同url访问所返回的数据
要想让ListView中两个item之间产生margin间隙,只需在item布局最外层再加上一个LinearLayout布局,然后再第二层中设置margin属性才能生效,代码如下:
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="100dp"
- >
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
- android:layout_marginTop="5dp"
- android:layout_marginBottom="3dp"
- android:background="@drawable/rect_gray"
- >
动态设置viewpager 条目是否可滑动
public class NoScrollViewPager extends ViewPager { private boolean isScroll; public NoScrollViewPager(Context context, AttributeSet attrs ){ super(context, attrs); } public NoScrollViewPager(Context context) { super(context); } /** * 1.dispatchTouchEvent一般情况不做处理 *,如果修改了默认的返回值,子孩子都无法收到事件 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); // return true;不行 } /** * 是否拦截 * 拦截:会走到自己的onTouchEvent方法里面来 * 不拦截:事件传递给子孩子 */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // return false;//可行,不拦截事件, // return true;//不行,孩子无法处理事件 //return super.onInterceptTouchEvent(ev);//不行,会有细微移动 if (isScroll){ return super.onInterceptTouchEvent(ev); }else{ return false; } } /** * 是否消费事件 * 消费:事件就结束 * 不消费:往父控件传 */ @Override public boolean onTouchEvent(MotionEvent ev) { //return false;// 可行,不消费,传给父控件 //return true;// 可行,消费,拦截事件 //super.onTouchEvent(ev); //不行, //虽然onInterceptTouchEvent中拦截了, //但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法. if (isScroll){ return super.onTouchEvent(ev); }else { return true;// 可行,消费,拦截事件 } } public void setScroll(boolean scroll) { isScroll = scroll; } }
mViewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, final int positionOffsetPixels) {
if (mViewPagerIndex == position) {//左滑动 else 右滑
if (position == 1 && !isHavePower && isFirst) { // 左侧滑动 只监听第一次滑动事件 mViewpager.setScroll(false); isFirst = false; // 区分第一次进来 final boolean needmove = (boolean) SpUtils.get(MainActivity.this, Constant.HAS_POWER_MOVE, true); if (needmove) { int width = getWindowManager().getDefaultDisplay().getWidth(); mViewpager.setScrollX(width);// 第二次 viewpage移动 } else { mViewpager.setScrollX(0);//第一次 viewpage不移动 } }} else {
if (mViewPagerIndex == 1 && isFirst && positionOffset != 0) {//为首页 右滑出来左侧菜单 mViewpager.setScroll(false); isFirst = false; mViewpager.setScrollX(0);//viewpage不移动 final boolean needmove = (boolean) SpUtils.get(MainActivity.this, Constant.HAS_POWER_MOVE, true); if (needmove) { int width = getWindowManager().getDefaultDisplay().getWidth(); mViewpager.setScrollX(width);//viewpage移动 } else { mViewpager.setScrollX(0);//viewpage不移动 } mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);//设置可滑动 }}
@Override public void onPageScrollStateChanged(int state) { if (state == 1) {// mViewPagerIndex记录当前选中的条目 mViewPagerIndex = mViewpager.getCurrentItem(); } else if (state == 2) { mViewPagerIndex = mViewpager.getCurrentItem(); } }}
public boolean onTouch(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN://监听按下动作 设置ViewPager可滑动 isFirst = true; mViewpager.setScroll(true); break; } return false; }
CardView作为最外层父布局设置圆角效果会有白色矩形背景,只有在CardView外在包裹一层,矩形圆角消失