自学笔记—智能短信项目第一天
2016-07-20 21:49
267 查看
智能短信笔记1
视频02
1 提取基类,让抽象类BaseActivity继承activity方法
2 在BaseActivity的onCreat方法中写initView,initDate,initLisener方法
3 在mainactivity中实现上述方法
4 在基类中继承onclicklistenner,实现其onclick方法,在写抽象方法processClick(View v);并在onClick中调用此方法,使子类继承基类后实现此方法。以实现对按钮的监听
5 在mainactivity中的initView方法中setcontentview;产生界面;并且找组件的工作都在initView方法中进行,在initListener中设置组件的点击事件监听,this
6 在processClick中通过switch case 组件id设置点击事件//v.getId()
7 去标题的方法
(1)主题parent = “@android:style/Theme.NoTitleBar”的主题里没标题,但是其版本过低
(2)上述主题有item一属性:<item name = “android:windowNoTitle”>true</item>
(3) 把此属性放到AppBaseTheme中就行了
视频03
1 该app整体上是一个activity,最上面的标题栏始终不变,变的是下面的fragment
2 整体上是一个竖直排列的linear布局,
3 ViewPager组件是在v4支持包中,该包也是谷歌提供的,可以在Addroid Dependencies目录中的v4.view目录中找到,复制其全部包名
4 看v4包源码的流程
(1)v4包由谷歌提供,所以源码在胺碘酮目录下的sdk\extras\android\support\v4\src目录下,
(2)复制其src目录
(3)在libs目录下创建与包同名的文件.jar.properties
(4) 在文件的首行写:src=目录
(5)其中单斜杠都要变成双斜杠,没有引号,重启
5 ViewPager的大小可以设置为matchParents。因其后定义,所以matchParents不会覆盖其他组件
6 为其设置id:viewPager
7 viewPager继承自viewGroup,可以有子节点,类似layout
8 因为红线独立于选项卡而移动,红线是在包裹三个选项卡的linearLayout之外的
9 上述两组件被一个Relative包裹
10 relative的高度60
11 View的位置要对其父节点的底部 Layout_alignParentBottom = “true”
视频04
1 在mainactivity中的initView中找到组件,先找ViewPager
2 因为Viewpager中要放fragment,所以现在去创建fragment,抽象类BaseFragment继承v4包下的fragment,为了向下兼容
3 创建onCreatView方法,该对象返回的view会作为fragment的显示内容
4 返回的view对象不是写死的,所以需要实现类来弄,弄一个initView抽象方法,其参数和onCreatView一样,复制就行
5 oncreatView的return设为initView(%……%&……%);让其view由子类来实现
6 创建onActivityCreated方法,该方法会在界面创建时自动调用,再创建抽象方法initListener()和initDate();在其中调用这两方法,类似BaseActivity
7 使BaseFragment实现clickListener方法,在onClick中调用自定义抽象方法processClick用来监听点击事件
8 ViewPager是用adapter来设置子节点的,也就是条目,该adapter是pagerAdapter
9 但是pagerAdapter是一个抽象类,所以要自定义类来继承其(v4包下),该类创建在adapter包下//MainPagerAdapter
10 恩,不对,因为要显示的是fragment,所以用继承其实现类FragmentPagerAdapter就行了,不用继承上述那个抽象类
11 Getitem方法会返回ViewPager条目,也就是fragment的显示内容,
12 getCount会返回条目个数
13 定义泛型为Fragment的List集合,用来存储fragment,然后上述的getItem方法return为fragments.get(position).getCount的是fragments.size();
14 还有,fragments是传进来的,所以在构造方法中添加上List<Fragments>参数,然后构造方法中this.fragments=fragments
视频05_ViewPager显示三个Fragment
1 在ui.fragment包下创建3个fragment,都继承自basefragment//Conversation
a969
/Group/Search
2 创建布局文件,先简单写几段文字
3 在iniView中填充布局文件并返回,就会在基类的onCreatView中返回View
4 在initView中inflate布局文件,获取View对象,并返回
5 另外两个fragment也先这样写
6 在MainActivity中的initData中在ViewPager中填充Fragment,需要创建MainPagerAdapter对象,第一个参数为FragmentManager,然后ViewPager.setAdapter
7 在基类Activity中把继承Activity改为继承FragmentActivity,这样就可以在其子类中getSupportFragmentManager,获取
8 第二个参数是一个用来封装三个条目的集合,现在在initData中创建出来//new ArrarList
9 创建三个Fragment对象,并都存到List中
视频06_改变选项卡的文字大小和颜色
1 在mainActivity的initListener中设置viewPager的setOnPagerChangeListener,并用匿名类实现,该方法在viewPager界面切换时会触发
2 创建log工具类
(1) 在utils包下创建logUtils类其中方法都静态
(2) 创建静态i方法,在类中创建boolean变量,用于在i方法中判断是否要输出log,
(3) 把i方法的第一个参数设为Object,使其可以在被调用时传入this,在log.i的第一个参数中设置,*.getClass().getSimpleName()
3 上述Listener中的onPagerSelectef方法在切换完成后调用,position是切换界面后的索引
4 所以改变文字大小的方法在上述方法中调用
5 创建textLightAndScale方法
6 给三个文本设置id:tv_tab_conversation。在initview中找到其控件
7 设置颜色和大小需要知道现在是第几个界面,通过viewPager.getCurrentItem();
8 setTextColor方法用三目运算符弄,(item==0?Color.WHITE : 0xaa666666)
9 剩下两个同理,并且把text的初始颜色也要改,可以直接在布局文件中改,也可以在initData中直接调用setTextColor方法,这样全为false了
10 设置属性动画用ViewPropertyAnimator,不过该方法不支持低版本,导入nineoldandroids包就行了
11 ViewPropertyAnimator.animate(View对象).scaleX(item==0?1.2f : 1).setDuration(200);
视频07_选项卡点击事件
1 给选项的linearLayout设置id,点击事件在initListener中设置//ll_tab_conversation,this
2 在processClick中switch其id
3 viewPager。setCurrentItem设置当前界面
视频08_选项卡的红线移动
1 先给view一个id找到红条//v_indicate_line
2 在initData中调用计算红线长度方法:computeLineIndicateWidth
3 通过getWindowManager().getDefualtDisplay().getWidth()可以获得屏幕宽度,然后除以3
4 设置View宽度的方法:**.getLayoutParams().width = **
5 ViewPager滑动过程中onPagerScrolled会不断调用,第二个参数是滑动的百分比,第三个参数是滑动的像素
6 红线移动的距离distance设置为第三个参数除以3,通过ViewPropertyAnimate实现移动
7 红线移动的距离为:distance+position*红线.getWidth();
8 注意:此方法中的position不是索引,而是前一个Fragment的索引。所以往回划的时候才不会出屏幕,因为他用的是左边那个的索引啊
视频09_ConversationFragment的布局
1 conversation中设置ListView,权重分配1
2 选项卡是按钮被包裹在LinearLayout中,高度60dp,按钮高度30
3 Linear设置两边间距padingLeft和right都为30dp,按钮之间的margainLeft也设置成30dp,linear设置gra居中
4 通过selector实现按钮的点击效果
(1) 创建drawable文件夹,在其中创建selector的xml文件;//selector_btn_bg
(2) 创建item目录,第一个写drawable指定资源文件,第二个写state_pressed
(3) 注意,该xml文件可被当做资源文件来使用
5 复制linearLayout,弄三个按钮,然后将两LinearLayout用RelativeLayout包裹
6 在下面那个linearLayout中设置translationY,60dp
视频10_会话界面底部菜单的切换
1 给五个按钮全部设置id//bt_conversation_select
2 在conversationFragment中找到组件,用的是view.findViewById,并且在initListener中全部设置监听,在processClick中实现监听switch
3 创建两个方法showSelectMenu和showEditMenu,让按钮点击调用此两方法
4 给线性布局一个id,让其可以整体移动ll_conversation_select_menu
5 上述方法的移动通过ViewProPertyAnimator来实现,移动距离是控件的高度get。选择菜单的移动距离是0,因为它只需要回到原位就可以了
6 实现移动的分开先后执行:通过延时执行,new Handler().postDelayed(new Runnable()){%$#$%};在润方法中执行,最后一个参数是延时时间
视频11_看源码分析如何查会话
1 短信都存储在threads中
2 有几个会话就有几个记录
3 Snippet:显示最新一条短信的内容
1 thread_id就是会话id,号码(address)和会话id是绑定的
1 在源码中寻找匹配规则,源码在
在其中搜索addURI,找匹配规则
由上图可知。Path改为conversations就是查询会话了
2 创建globle包和Constance类用于存储常量,
3 在其中创建内部接口URI,此接口下的常量会默认为静态的,
4 Uri URI_SMS_CONVERSATION = Uri.parse(“content://sms/conversations”);//静态uri,内容提供者
5 在ConversationFragment中的initData方法中,getActivity().getContentResolver.query(),fragment中无法调用activity中的获得内容解析者的方法,所以要getActivity()。上述方法第一个参数是uri,就用静态方法中定义的那个就可以了
6 第二个参数是字段名
7 调用ContentResolver的query方法,实际上调用的是内容提供者的query方法
由上图可知,where和 字段都已设好,所以剩余参数全部给null
由上图可知,query查询的是sms表
由上图可知,查询的where条件是会话id
由上图可知,查询的字段是这三个
由以上三图拼接得到第四图,然后查询得到下图
三个字段分别是,最新短信,会话id和短信数量
视频12_异步查询会话
1 上个视频的getActivity().getContentResolver().query()方法返回的是一个Cursor,cursor返回的是查询得到的数据//以thread_id分条
2 加上读取短信的权限READ_SMS
3 在utils包下创建CursorUtil类用于解析Cursor,实现静态方法printCursor,其参数是Cursor
4 cursor的几个方法:
cursou.moveToNext()//移动到下一行并且返回值为boolean cursor.getCount()//获取行数 cursor.getColumnCount()获取字段数量
cursor.getColumnName(int参数)//获取字段名 cursor.getString(int参数)//获取字段内容
5数据库查询需要异步查询,可以开子线程,在此有更好的方法
7 创建一个dao包用于操作数据库,创建类SimpleQueryHandler继承AsyncQueryHandler//异步数据库处理器,该方法的构造需要传入一个内容提供者
8 上述initData中方法全部注释,然后new一个上述类,get一个内容提供者作为其参数
9 然后new出来的那东西startQuery()//开始异步查询
第一个参数用于携带一个整形数据的,现在用不到,传个0。
第二个参数用于携带一个Object,暂时用不到,传个null
第三个参数是Uri
后面四个参数分别是:projection字段,selection where条件。selectionArgs Where条件占位符,oderBy排序
上述四个参数都不要传null;
10 在SimpleQueryHandler类中在加一个方法:onQueryComplete,该方法会在异步查询结束后自动调用,前两个参数是携带的整形和object数据,第三个参数cursor就是查询得到的结果
视频13_创建CursorAdapter
1 在ConversationFragment中拿到ListView
2 创建ConversationListAdapter,继承自CursorAdapter//不是v4包下那个,cursorAdapter会随着数据库的改变自动刷新界面
3 NewView方法返回的View对象就是ListView的条目。bindView用于设置ListView每个条目要显示的内容
4 在ConversationFragment中的initData方法中new一个ConversationListAdapter,adapter
5 现在需要获取adapter对象,可以在开启异步查询的cookie参数中携带adapter,
6 在接受前还可以再加一判断if(cookie!=null&& cookie instanceof CursorAdapter),然后将cookie强转为adapter,然后changeAdapter(cursor)设置界面//此行代码现在还不能运行,可先注掉
7 ListView再setAdapter
视频02
1 提取基类,让抽象类BaseActivity继承activity方法
2 在BaseActivity的onCreat方法中写initView,initDate,initLisener方法
3 在mainactivity中实现上述方法
4 在基类中继承onclicklistenner,实现其onclick方法,在写抽象方法processClick(View v);并在onClick中调用此方法,使子类继承基类后实现此方法。以实现对按钮的监听
5 在mainactivity中的initView方法中setcontentview;产生界面;并且找组件的工作都在initView方法中进行,在initListener中设置组件的点击事件监听,this
6 在processClick中通过switch case 组件id设置点击事件//v.getId()
7 去标题的方法
(1)主题parent = “@android:style/Theme.NoTitleBar”的主题里没标题,但是其版本过低
(2)上述主题有item一属性:<item name = “android:windowNoTitle”>true</item>
(3) 把此属性放到AppBaseTheme中就行了
视频03
1 该app整体上是一个activity,最上面的标题栏始终不变,变的是下面的fragment
2 整体上是一个竖直排列的linear布局,
3 ViewPager组件是在v4支持包中,该包也是谷歌提供的,可以在Addroid Dependencies目录中的v4.view目录中找到,复制其全部包名
4 看v4包源码的流程
(1)v4包由谷歌提供,所以源码在胺碘酮目录下的sdk\extras\android\support\v4\src目录下,
(2)复制其src目录
(3)在libs目录下创建与包同名的文件.jar.properties
(4) 在文件的首行写:src=目录
(5)其中单斜杠都要变成双斜杠,没有引号,重启
5 ViewPager的大小可以设置为matchParents。因其后定义,所以matchParents不会覆盖其他组件
6 为其设置id:viewPager
7 viewPager继承自viewGroup,可以有子节点,类似layout
8 因为红线独立于选项卡而移动,红线是在包裹三个选项卡的linearLayout之外的
9 上述两组件被一个Relative包裹
10 relative的高度60
11 View的位置要对其父节点的底部 Layout_alignParentBottom = “true”
视频04
1 在mainactivity中的initView中找到组件,先找ViewPager
2 因为Viewpager中要放fragment,所以现在去创建fragment,抽象类BaseFragment继承v4包下的fragment,为了向下兼容
3 创建onCreatView方法,该对象返回的view会作为fragment的显示内容
4 返回的view对象不是写死的,所以需要实现类来弄,弄一个initView抽象方法,其参数和onCreatView一样,复制就行
5 oncreatView的return设为initView(%……%&……%);让其view由子类来实现
6 创建onActivityCreated方法,该方法会在界面创建时自动调用,再创建抽象方法initListener()和initDate();在其中调用这两方法,类似BaseActivity
7 使BaseFragment实现clickListener方法,在onClick中调用自定义抽象方法processClick用来监听点击事件
8 ViewPager是用adapter来设置子节点的,也就是条目,该adapter是pagerAdapter
9 但是pagerAdapter是一个抽象类,所以要自定义类来继承其(v4包下),该类创建在adapter包下//MainPagerAdapter
10 恩,不对,因为要显示的是fragment,所以用继承其实现类FragmentPagerAdapter就行了,不用继承上述那个抽象类
11 Getitem方法会返回ViewPager条目,也就是fragment的显示内容,
12 getCount会返回条目个数
13 定义泛型为Fragment的List集合,用来存储fragment,然后上述的getItem方法return为fragments.get(position).getCount的是fragments.size();
14 还有,fragments是传进来的,所以在构造方法中添加上List<Fragments>参数,然后构造方法中this.fragments=fragments
视频05_ViewPager显示三个Fragment
1 在ui.fragment包下创建3个fragment,都继承自basefragment//Conversation
a969
/Group/Search
2 创建布局文件,先简单写几段文字
3 在iniView中填充布局文件并返回,就会在基类的onCreatView中返回View
4 在initView中inflate布局文件,获取View对象,并返回
5 另外两个fragment也先这样写
6 在MainActivity中的initData中在ViewPager中填充Fragment,需要创建MainPagerAdapter对象,第一个参数为FragmentManager,然后ViewPager.setAdapter
7 在基类Activity中把继承Activity改为继承FragmentActivity,这样就可以在其子类中getSupportFragmentManager,获取
8 第二个参数是一个用来封装三个条目的集合,现在在initData中创建出来//new ArrarList
9 创建三个Fragment对象,并都存到List中
视频06_改变选项卡的文字大小和颜色
1 在mainActivity的initListener中设置viewPager的setOnPagerChangeListener,并用匿名类实现,该方法在viewPager界面切换时会触发
2 创建log工具类
(1) 在utils包下创建logUtils类其中方法都静态
(2) 创建静态i方法,在类中创建boolean变量,用于在i方法中判断是否要输出log,
(3) 把i方法的第一个参数设为Object,使其可以在被调用时传入this,在log.i的第一个参数中设置,*.getClass().getSimpleName()
3 上述Listener中的onPagerSelectef方法在切换完成后调用,position是切换界面后的索引
4 所以改变文字大小的方法在上述方法中调用
5 创建textLightAndScale方法
6 给三个文本设置id:tv_tab_conversation。在initview中找到其控件
7 设置颜色和大小需要知道现在是第几个界面,通过viewPager.getCurrentItem();
8 setTextColor方法用三目运算符弄,(item==0?Color.WHITE : 0xaa666666)
9 剩下两个同理,并且把text的初始颜色也要改,可以直接在布局文件中改,也可以在initData中直接调用setTextColor方法,这样全为false了
10 设置属性动画用ViewPropertyAnimator,不过该方法不支持低版本,导入nineoldandroids包就行了
11 ViewPropertyAnimator.animate(View对象).scaleX(item==0?1.2f : 1).setDuration(200);
视频07_选项卡点击事件
1 给选项的linearLayout设置id,点击事件在initListener中设置//ll_tab_conversation,this
2 在processClick中switch其id
3 viewPager。setCurrentItem设置当前界面
视频08_选项卡的红线移动
1 先给view一个id找到红条//v_indicate_line
2 在initData中调用计算红线长度方法:computeLineIndicateWidth
3 通过getWindowManager().getDefualtDisplay().getWidth()可以获得屏幕宽度,然后除以3
4 设置View宽度的方法:**.getLayoutParams().width = **
5 ViewPager滑动过程中onPagerScrolled会不断调用,第二个参数是滑动的百分比,第三个参数是滑动的像素
6 红线移动的距离distance设置为第三个参数除以3,通过ViewPropertyAnimate实现移动
7 红线移动的距离为:distance+position*红线.getWidth();
8 注意:此方法中的position不是索引,而是前一个Fragment的索引。所以往回划的时候才不会出屏幕,因为他用的是左边那个的索引啊
视频09_ConversationFragment的布局
1 conversation中设置ListView,权重分配1
2 选项卡是按钮被包裹在LinearLayout中,高度60dp,按钮高度30
3 Linear设置两边间距padingLeft和right都为30dp,按钮之间的margainLeft也设置成30dp,linear设置gra居中
4 通过selector实现按钮的点击效果
(1) 创建drawable文件夹,在其中创建selector的xml文件;//selector_btn_bg
(2) 创建item目录,第一个写drawable指定资源文件,第二个写state_pressed
(3) 注意,该xml文件可被当做资源文件来使用
5 复制linearLayout,弄三个按钮,然后将两LinearLayout用RelativeLayout包裹
6 在下面那个linearLayout中设置translationY,60dp
视频10_会话界面底部菜单的切换
1 给五个按钮全部设置id//bt_conversation_select
2 在conversationFragment中找到组件,用的是view.findViewById,并且在initListener中全部设置监听,在processClick中实现监听switch
3 创建两个方法showSelectMenu和showEditMenu,让按钮点击调用此两方法
4 给线性布局一个id,让其可以整体移动ll_conversation_select_menu
5 上述方法的移动通过ViewProPertyAnimator来实现,移动距离是控件的高度get。选择菜单的移动距离是0,因为它只需要回到原位就可以了
6 实现移动的分开先后执行:通过延时执行,new Handler().postDelayed(new Runnable()){%$#$%};在润方法中执行,最后一个参数是延时时间
视频11_看源码分析如何查会话
1 短信都存储在threads中
2 有几个会话就有几个记录
3 Snippet:显示最新一条短信的内容
1 thread_id就是会话id,号码(address)和会话id是绑定的
1 在源码中寻找匹配规则,源码在
在其中搜索addURI,找匹配规则
由上图可知。Path改为conversations就是查询会话了
2 创建globle包和Constance类用于存储常量,
3 在其中创建内部接口URI,此接口下的常量会默认为静态的,
4 Uri URI_SMS_CONVERSATION = Uri.parse(“content://sms/conversations”);//静态uri,内容提供者
5 在ConversationFragment中的initData方法中,getActivity().getContentResolver.query(),fragment中无法调用activity中的获得内容解析者的方法,所以要getActivity()。上述方法第一个参数是uri,就用静态方法中定义的那个就可以了
6 第二个参数是字段名
7 调用ContentResolver的query方法,实际上调用的是内容提供者的query方法
由上图可知,where和 字段都已设好,所以剩余参数全部给null
由上图可知,query查询的是sms表
由上图可知,查询的where条件是会话id
由上图可知,查询的字段是这三个
由以上三图拼接得到第四图,然后查询得到下图
三个字段分别是,最新短信,会话id和短信数量
视频12_异步查询会话
1 上个视频的getActivity().getContentResolver().query()方法返回的是一个Cursor,cursor返回的是查询得到的数据//以thread_id分条
2 加上读取短信的权限READ_SMS
3 在utils包下创建CursorUtil类用于解析Cursor,实现静态方法printCursor,其参数是Cursor
4 cursor的几个方法:
cursou.moveToNext()//移动到下一行并且返回值为boolean cursor.getCount()//获取行数 cursor.getColumnCount()获取字段数量
cursor.getColumnName(int参数)//获取字段名 cursor.getString(int参数)//获取字段内容
5数据库查询需要异步查询,可以开子线程,在此有更好的方法
7 创建一个dao包用于操作数据库,创建类SimpleQueryHandler继承AsyncQueryHandler//异步数据库处理器,该方法的构造需要传入一个内容提供者
8 上述initData中方法全部注释,然后new一个上述类,get一个内容提供者作为其参数
9 然后new出来的那东西startQuery()//开始异步查询
第一个参数用于携带一个整形数据的,现在用不到,传个0。
第二个参数用于携带一个Object,暂时用不到,传个null
第三个参数是Uri
后面四个参数分别是:projection字段,selection where条件。selectionArgs Where条件占位符,oderBy排序
上述四个参数都不要传null;
10 在SimpleQueryHandler类中在加一个方法:onQueryComplete,该方法会在异步查询结束后自动调用,前两个参数是携带的整形和object数据,第三个参数cursor就是查询得到的结果
视频13_创建CursorAdapter
1 在ConversationFragment中拿到ListView
2 创建ConversationListAdapter,继承自CursorAdapter//不是v4包下那个,cursorAdapter会随着数据库的改变自动刷新界面
3 NewView方法返回的View对象就是ListView的条目。bindView用于设置ListView每个条目要显示的内容
4 在ConversationFragment中的initData方法中new一个ConversationListAdapter,adapter
5 现在需要获取adapter对象,可以在开启异步查询的cookie参数中携带adapter,
6 在接受前还可以再加一判断if(cookie!=null&& cookie instanceof CursorAdapter),然后将cookie强转为adapter,然后changeAdapter(cursor)设置界面//此行代码现在还不能运行,可先注掉
7 ListView再setAdapter
相关文章推荐
- osgi bundle通信方式
- 关于排序方法有了一个笼统的了解
- GUI监听器实现方式
- jQuery Mobile 事件
- Guess Number Higher or Lower
- LINQ和Lambda表达式
- 企财险知识汇总
- 技术类博客网站推荐(转)
- java连接mysql(一)
- Android开发学习之路-记一次CSDN公开课
- Servlet学习笔记(HttpServletRequest对象)
- 【BZOJ 1911】【APIO 2010】特别行动队
- div文本垂直居中(div text vertical aligan)
- Git使用杂记
- 代码生成阶段的主要任务是:
- [Leetcode]209. Minimum Size Subarray Sum
- 最优比例生成环---其实树也差不多
- 【CSS】过渡、动画和变换
- Linux之守护进程
- java程序运行时内存分配详解