android学习中知识点集合(未完)

来源:互联网 发布:阿里云ecs搭建网站 编辑:程序博客网 时间:2024/06/15 14:19

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:onclick="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)修改子布局宽高


0 0
原创粉丝点击