Android 学习至今的笔记,不定期更新。
写到后面逐渐发现,学Android开发很容易陷入API的海洋里,也不知是好事还是坏事。
14.2.27
手指触摸屏幕时,从父层级传递到子层级。顺序如下(假设层级为Activity-ViewGroup-View):
Activity.dispatchTouchEvent() : 调用window的根view的dispatchTouchEvent()
ViewGroup.dispatchTouchEvent() : 先调用ViewGroup.onInterceptTouchEvent()判断是否拦截,不拦截则调用相应位置的子View.dispatchTouchEvent()
ViewGroup.onInterceptTouchEvent() : true–>ViewGroup.onTouchEvent() false–>向下传递
View.dispatchTouchEvent(): 优先传递给OnTouchListener,没有的话传递给View.onTouchEvent()
View.onTouchEvent(): 返回true表示消费掉了,否则向上传递onTouchEvent
ViewGroup.onTouchEvent(): 同上
Activity.onTouchEvent(): 同上
通常来说。我们**不需要重写dispatchTouchEvent()**。
对于底层的View来说,有一种方法可以阻止父层的View截获touch事件,就是调用getParent().requestDisallowInterceptTouchEvent(true);方法。一旦底层View收到touch的action后调用这个方法那么父层View就不会再调用onInterceptTouchEvent了,也无法截获以后的action。
14.2.28
嵌套Fragment的时候,比如SlidingMenu控制的每一个Fragment中添加用Fragment组成的ViewPager:
对于其使用的FragmentManager,如果是顶层Fragment,那么调用FragmentManager的时候,应该这样写getActivity().getSupportFragmentManager(),如果是嵌套的Fragment,那么应该写getChildFragmentManager()
14.3.18
对于ListView的自定义Item,有时会出现设置的OnItemClickListener无法响应的情况。原因主要是焦点问题。解决方法只需在Item的根节点加入 android:descendantFocusability=”blocksDescendants” 即可。
14.3.21
使用SharedPreference多进程数据共享出错问题:
首先要将获取SharedPreference的MODE设置为: MODE_MULTI_PROCESS 。
其次为了保证修改数据实时提交到磁盘,不要将SharedPreference设置成成员变量,尽量在哪里修改就在哪里直接获取SharedPreference,修改后别忘记commit。
14.5.5
解决listview的各项显示错位的问题:
根本原因在于convertView的使用,由于if (null == convertView) 的判断, 导致缓存中的可能会留给新加载的view
解决方法,重写函数:
getViewTypeCount()就是获取列表有几种布局类型,getItemViewType(int position)是获取在position位置上的布局类型。
14.7.23
对于android 4.3+系统通知栏显示:“**********”正在运行 的原因:
Service.startForeground()这句话的作用。
14.8.11
其实很早就写在代码里了但是一直没没有写在笔记里
更新Listview一般使用adapter的notifyDataSetChanged。这里需要注意:
adapter在初始化时传递的data引用,只有对该引用的数据进行修改才能正确的使listview更新数据
一切更新和修改都需要在原数据源上进行,一切给data赋值的语句都是改变引用,导致无法正确更新数据
所以正确的更新方法,要先data.clear();而不是data=new ArrayList<***>();
还有一个AsyncTask的使用方法,我们在应用中执行AsyncTask最好使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,*****);防止多线程阻塞
15.5.13
整理一下android.support.v4.widget 常用的控件吧:
ViewPager
PagerTabStrip(其实不是widget下的,viewpager的滑动indicator)
DrawerLayout
SwipeRefreshLayout (下拉刷新效果可能和常见的不同)
如果要自己实现拖动效果,可以考虑ViewDragHelper,或者SlidingPaneLayout
FragmentTransaction可以将layout里的Framelayout替换成Fragment对象
15.5.27
使用Animation做动画的时候要注意:即使设置了setfillafter(true)改变了view的位置/大小,view的实际属性并没有改变。
如果希望动画结束后能改变属性,应该使用ValueAnimator(ObjectAnimator)。