1.android中删除短信和电话记录,是删除数据库的数据。删除联系人,只是将联系人raw_contacts表中的contact_id置为空;
2.android中在代码中写入的宽高都是以像素为单位的,xml中可以用dip。
3.默认popupwindow是没有背景的。(android动画播放,窗体必须有背景的)设置popupwindow背景后,可以给其他view设置动画。popWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
4.onSaveInstanceState是用户点击home键,在onStop()前调用。直接按back键是不会调用的。
onRestoreInstanceState只有在系统回收后台Activity后(用户按home键),再打个该Activity时调用。
12-20 12:27:21.042: I/System.out(5886): +++++++++onPause+++++++++
12-20 12:27:21.472: I/System.out(5886): +++++++++onSaveInstanceState+++++++++Bundle[{}]
12-20 12:27:21.472: I/System.out(5886): +++++++++onStop+++++++++
12-20 12:27:42.892: I/System.out(6494): +++++++++onCreate+++++++++Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=832]}]
12-20 12:27:42.892: I/System.out(6494): +++++++++onStart+++++++++
12-20 12:27:42.892: I/System.out(6494): +++++++++onRestoreInstanceState+++++++++Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=832]}]
12-20 12:27:42.892: I/System.out(6494): +++++++++onPostCreate+++++++++Bundle[{android:viewHierarchyState=Bundle[{android:views=android.util.SparseArray@b6533090, android:Panels=android.util.SparseArray@b6532ca0, android:ActionBar=android.util.SparseArray@b65332b0}]}]
12-20 12:27:42.892: I/System.out(6494): +++++++++onResume+++++++++
12-20 12:27:42.892: I/System.out(6494): +++++++++onPostResume+++++++++
5. ListView 在setOnScrollListener后,会先调用onScroll();invokeOnItemScrollListener中会调用onScroll();
android系统源码如下:
public void setOnScrollListener(OnScrollListener l) {
mOnScrollListener = l;
invokeOnItemScrollListener();
}
/**
* Notify our scroll listener (if there is one) of a change in scroll state
*/
void invokeOnItemScrollListener() {
if (mFastScroller != null) {
mFastScroller.onScroll(this, mFirstPosition, getChildCount(), mItemCount);
}
if (mOnScrollListener != null) {
mOnScrollListener.onScroll(this, mFirstPosition, getChildCount(), mItemCount);
}
onScrollChanged(0, 0, 0, 0); // dummy values, View's implementation does not use these.
}
6 ?布局中有checkbox,会把整个布局的焦点抢走。
7. 服务里面没有任务栈信息,如果在服务开启Activity需要记得添加任务栈的flag
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
8.隐式启动activity时不要使用如下action和category,要再定义一个intent-fitler。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
使用如下:
<intent-filter>
<action android:name="com.mobilesecurity.shortcut"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
9.onKeyDown和onKeyUp方法中注意返回值处理,若处理了返回true,不然要点2次才能响应一下,可能与key的dispatch有关。如下:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_MENU){
System.out.println("KeyEvent.KEYCODE_MENU");
if(isShowLevel1){
MyAnimationUtils.moveOutTweens(level1, 0);
isShowLevel1 = false;
if(isShowLevel2){
MyAnimationUtils.moveOutTweens(level2, 300);
isShowLevel2 = false;
if(isShowLevel3){
MyAnimationUtils.moveOutTweens(level3, 600);
isShowLevel3 = false;
}
}
}else{
MyAnimationUtils.moveInTweens(level1, 0);
isShowLevel1 = true;
MyAnimationUtils.moveInTweens(level2, 300);
isShowLevel2 = true;
}
return true;
}
return super.onKeyDown(keyCode, event);
}
10 .PopupWindow 使用时,pw.setFocusable(true):是PopupWindow 中listView的itemclick得到响应,否则itemclick没有响应。
问题:创建了一个PopupWindow,里面要显示listView,这样子的话,listView的itemClick要得到实现,必须要让PopupWindow得到焦点,可是PopupWindow得到焦点之后,parentView 的一些onTouch事件就得不到响应,在这个时候应该怎么办?
解决:PopupWindow得到焦点:window.setFocusable(true); 也要让除了PopupWindow之外的得到响应需要--window.setBackgroundDrawable(new BitmapDrawable());
11.view 中定义了onTouchEvent(若view是CLICKABLE或者LONG_CLICKABLE,一直消耗touch事件)和dsipatchTouchEvent (先执行touchListener,在执行onTouchEvent。只有touchListener的返回值为false,才执行onTouchEvent);
ViewGroup中定义了dsipatchTouchEvent (重写父类view的)和onInterceptTouchEvent;继承了父类view的onTouchEvent
12. view.getWidth()和view.getHeight()是在view layout()之后才有数据的。在父视图中onLayout()不能使用这个来获得子view的宽高。这里可以使用view.getMeasureWidth()和view.getMeasureHeight(),这个两个方法只要view调用过onMeasure()就会有数据的,也可以使用view的LayoutParams。
view有两宽高:一种是测量得到的getMeasureWidth()和view.getMeasureHeight(),这种宽高是onMeasure函数中调用setMeasuredDimension()方法设置的,;
一种是实际的getWidth()和getHeight(),这种事是layout后赋值的,所以说测量的宽高和实际的有可能不一样,就是因为layout()方法的参数没有按照测量的结果来显示。
13 view中measure()(该函数是final的,不让重写) 和onMeasure()(主要用来重写,在measure中会调用它)。
由父View调用子view的measure(),在这个方法中会调用子view的onMeasure();
View的draw() 和layout()虽然不是final的,但不建议重写,子类可以重写onDraw和onLayout方法。viewroup子类必须重新onLayout();
viewGroup子类而言,OnMeasure不是必须的,因为最终子view的大小和位置是layout决定的,onlayout才是必须的。
14. 自定义view分两类:
1)自定义view继承view:需要重写onMeasure和onDraw方法。若不实现onMeasure,View的宽高不能为wrap_content,只能为match_parenet或者确定数值。
2)自定义view继承viewgroup或者其子类:需要重写onMeasure(测量自己和孩子view的大小。若孩子是简单View,可以直接onLayout中确定位置,不要实现onMeasure;若是布局,必须实现onMeasure)、onLayout(确定孩子view的位置,自己已经在自己的layout中确定了)和onDraw()方法?。
mView.draw()开始绘制,draw()方法实现的功能如下:
1 、绘制该View的背景
2 、为显示渐变框做一些准备操作(见5,大多数情况下,不需要改渐变框)
3、调用onDraw()方法绘制视图本身 (每个View都需要重载该方法,ViewGroup不需要实现该方法)
4、调用dispatchDraw ()方法绘制子视图(如果该View类型不为ViewGroup,即不包含子视图,不需要重载该方法)
值得说明的是,ViewGroup类已经为我们重写了dispatchDraw ()的功能实现,应用程序一般不需要重写该方法,但可以重载父类
函数实现具体的功能。
15 layout(int l, int t, int r, int b) 中坐标都是相当父布局来说的:
l Left position, relative to parent t Top position, relative to parent r Right position, relative to parent b Bottom position, relative to parent
16. scrollTo(x,y):是以手机窗体初始左上角为(0,0)原点,移动的是手机窗体,(x,y)是相对于(0,0)原点。是以(0,0)为参考点。
scroollBy(x,y):是在已有scroll的x,y大小的基础上进行滚动,最终都是通过scrollTo实现的。是以(已scroll的x,已scroll的y)为参考点。
17. Scroller使用
1)Sroller mScroller = new Srcoller();
2)mScroller.startScroll():设置动画的开始位置和位移大小; invalidate():该方法致使computescroll()调用;
4)重写computeScroll():在此方法中实现移动,该方法中必须有invalidate();
参考:http://blog.csdn.net/xiaanming/article/details/17483273
18. xml中android:οnclick="xxx"属性定义的点击事件可以定义在activity中,也可以定义在activity中包含的view中。
都是公用的。(但写在自定义的Viewgroup中不行)
下载例子代码:http://download.csdn.net/detail/fengyun703/9424941
public void click(View view){
int id = view.getId();
switch (id) {
case R.id.bt1: //MyView 中xml定义的button
System.out.println("bt1");
break;
case R.id.bt2: //MyView 中xml定义的button
System.out.println("bt2");
break;
case R.id.bt_actv: //activity 中xml定义的button
System.out.println("bt_actv");
break;
default:
break;
}
}
19. ViewDragHelper用来分析touch事件,处理拖拽事件。
1)创建(在Viewgroup的构造方法中)
mDragHelper =ViewDragHelper.create(Viewgroup , Callback );
2)touch事件分析。重写onTouchEvent()
public boolean onTouchEvent(MotionEvent event){
mDragHelper.processTouchEvent(event);
return true;
}
3) callback实现
class MyCallback extendsViewDragHelper.Callback{
}
down: tryCaptureView():现在要去分析Viewgroup的某个孩子的touch事件。
move:clampViewPositionHorizontal():水平移动某个孩子。
clampViewPositionVertical();垂直移动某个孩子。
up: onViewReleased();
4) viewDraghepler 移动view,但getScrollx的值都是0?
20. 使用补间动画,其实view的坐标位置没有改变,点击依然有效果。可以设置孩子的enable为false。
动画的所有中心点都以原有坐标为准。
21. 在View中设置setFocusableInTouchMode(true),可以让view响应onKeyDown和onKeyUp。
public YoukuMenu(Context context, AttributeSet attrs) {
super(context, attrs);
initial(context);
}
private void initial(Context context) {
View.inflate(context, R.layout.youkumenu, this);
setFocusableInTouchMode(true);
level1 = (RelativeLayout) findViewById(R.id.level1);
level2 = (RelativeLayout) findViewById(R.id.level2);
22. radiogroup 中每个孩子都要有id才能实现单选
23 ViewPager中孩子view让ViewPager不要拦截事件。down以后的事件也可以传到子view。
在孩子View的dispatchTouchEvent中调用getParent().requestDisallowInterceptTouchEvent(true);
代码如下:
public boolean dispatchTouchEvent(MotionEvent event) {
Log.i("test", "MyViewA dispatchTouchEvent "+EventUtils.getMotion(event));
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(event);
}
24 View.getHitRect(rect);获得view的矩形框。如下图所示:
25 去掉RadioButton的右边圆圈.
在xml中添加如下属性:
android:button = "@null"
android:background="@android:color/transparent"
26 在模拟器上访问本就tomcat服务器,可以使用ip地址:10.0.2.2,代表宿主电脑ip。
例如:http://10.0.2.2:8080/zhbj/categories.json
27 一般onInterceptTouchEvent 只在down事件中运行,只有Viewgroup的孩子响应该事件(即return true),
Viewgroup才有机会去拦截后续事件。否则onInterceptTouchEvent 只在down中出现。
onInterceptTouchEvent only get called if the parent has a child view which returns "true" from onTouchEvent.
Once the child returns true, the parent now has a chance to intercept that event.
28setFocusableInTouchMode()可以让自定义View响应按键(onKeyDown、onKeyUp),不然activity不会讲按键事件传给View。
29 setPadding()函数中参数可以为负数;效果如下:
30 自定义AlertDialog的View
AlertDialog.Builder builder = new Builder(this);
final AlertDialog dialog = builder.create();
View addView = View
.inflate(this, R.layout.dialog_add_blacknumber, null);
........
dialog.setView(addView, 0, 0, 0, 0);
dialog.show();
31. Xutils 的httputils 的callback是在主线程执行的。
HttpHandler中源码如下:
protected void onProgressUpdate(Object... values) {
if (this.state == State.CANCELLED || values == null || values.length == 0 || callback == null) return;
switch ((Integer) values[0]) {
case UPDATE_START:
this.state = State.STARTED;
callback.onStart();
break;
case UPDATE_LOADING:
if (values.length != 3) return;
this.state = State.LOADING;
callback.onLoading(
Long.valueOf(String.valueOf(values[1])),
Long.valueOf(String.valueOf(values[2])),
isUploading);
break;
case UPDATE_FAILURE:
if (values.length != 3) return;
this.state = State.FAILURE;
callback.onFailure((HttpException) values[1], (String) values[2]);
break;
case UPDATE_SUCCESS:
if (values.length != 2) return;
this.state = State.SUCCESS;
callback.onSuccess((ResponseInfo<T>) values[1]);
break;
default:
break;
}
}
32. HorizontalScrollView中子控件的getleft和getright与滑动没有关系。
scrollto和scrollby都对getleft和getright没有影响。
getleft是子控件到父控件的相对距离,与滑动没有关系。
33. Veiwpager 的OnPageChangeListener方法
onPageScrolled(int position, float positionOffset,
int positionOffsetPixels)
position:右划时,是目标页面(前一页);左划时,是当前页面;
positionOffset:当前位置与position页面的稳定位置的距离/相邻2个页面的距离。
positionOffsetPixels:与positionOffset类似,不过是像素为单位。
34. android 系统存储数据
1. data/data/xxx(包名)
该目录下内部存储中,默认情况只能该应用自己访问(可以创建公共的文件)。
2. mnt/sdcard/android/data/xxx(包名)
这个目录实在sdcard上,在该目录下可以存储数据,在清除cache和数据时,该目录下数据还存在,直到应用程序删除。只要有访问sdcard的权限 就能访问。用户组是sdcard_rw,有全部的权限,只有在这个组都能访问这些文件。
35. 启动模式是singleTask或者singleInstance的activity调用startactivityForResult()时不能正确返回数据。
参考文献 http://blog.csdn.net/sodino/article/details/22101881
android中不同task之间,activity默认是不能传递数据的。
36.killBackgroundProcesses和killProcess
killBackgroundProcesses(packagename):只能杀死后台进程,而且有些系统进程杀不死。
android.os.Process.killProcess(android.os.Process.myPid()) :能关闭当前activity,能杀死当前进程,但如果task中还有activity,会马上重启一个新的进程。
37 activity 调用onPause,是因为Called when the system is about to start resuming another activity.就是说有其他activity要到前台了。
38 相对布局嵌套,父布局宽高为wrap_content,子布局为match_parent,结果是显示为match_parent。可以通过修改父布局的宽高setLayoutParams(params), 修改子布局宽高。