您的位置:首页 > 其它

自学笔记—智能短信项目第一天

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: