接着上一篇,我们在 OAuthActivity 中获得到了 access_token
,我们将这个重要的值,传递给 MainActivity (关于Activity之间的传值, Fragment 与 Activity 的传值方式详见下文),在 MainActivity 中,我们要展示主界面,这里我使用了 BottomNavigationView + Fragment 。官方的这个 BottomNavigationView ,写的很简洁,也很好懂,但是还是有些 bug 不太好使。网上有很红的第三方库,却感觉没有官方这么整洁有序。接下来我们看看这个控件的使用方法。首先布局文件里添加
|
|
在创建该控件时候,会自动生成一个 menu.xml 文件,就是我们的底部菜单子项了。完善 menu 相关信息以后,在 Acitivity 中绑定控件,运行后我们可以看到,会有相应个按钮,但是会有动画,微博这里使用了 5 个,显然这个动画不太好看。多了显乱。于是这里,我们就需要去掉动画。但是理所想当然的我们会觉得官方应该给了我们一个去掉动画的属性直接设置,but ,没有。。
这里我们参考使用大神的 BottomNavigationViewHelper ,来做相关取消设置。
接下来我们可以设置默认选择第一个子项,使用代码
|
|
并且我们在这里要做到点击相应子项,显示相关 Fragment 。这里我写了 changeFragment 这个方法
|
|
我们需要获取 access_token
,以及其他 Fragment 会使用到的 uid 。当然,这两个参数我们完全可以写成全局变量。
接下来,我们首先了解一下如何创建一个 Fragment 。一个 Fragment 创建,首先要有一个 FragmentManager ,其次,创建需要一个 Transaction 。在创建完成以后,一定要commit,才能成功创建。这里我们需要一个容器,来盛放创建好的 Fragment ,所以,我们在 MainActivity 的布局文件中,使用一个 LinerLayout 作为盛放容器。我们需要切换 Fragment ,故我们使用 replace 来代替之前已经创建好的Fragment。首先,我们需要先初始化一个 Fragment ,不妨直接使用该方法,写在选择切换操作之前来初始化。接下来,我们只需使用 bottomNavigationView 的监听器监听点击事件,使用以上方法来创建相应的 Fragment 即可。然后我们会在每个 Fragment 中显示不同的内容,但是我们知道,他都要用到 access_token
,所以这时候,我们就需要把这个参数传递给各个 Fragment 。
在 Activity 之间传递参数,我们只需要用 Intent 就可以方便的进行传递:
|
|
而Activity向Fragment中传递参数:
|
|
在Fragment中取参数,onCreate方法中有相应的可以说是“模板”的操作了,照猫画虎总是会的
|
|
在Fragment接收参数以后,我们就可以开始进行 Fragment 的处理了。首先,我们在第一个 Fragment 中显示授权用户所关注好友的微博。很显然,我们需要一个 RecycleView 来放置所有的微博信息。 RecycleView 在《第一行代码》中就讲的十分详细了,这里我使用了 RecycleView + CardView 来显示每一块微博信息。这里的数据处理操作,和之前一样,我们使用 okhttp
进行请求,将返回的数据使用 Gson
封装处理。然后通过该对象的 get 方法来获得值。这里需要注意的就是,当我们在对盛放内容的容器进行操作时(如给 TextView 赋值),一定要在线程中进行。之前我们处理线程操作,会 new 一个子线程,但是我们在这里有更方便的操作。 runOnUiThread 方法。在 Activity 中我们要进行改变布局的事情,就可以直接使用这个方法,而在 Fragment 中,我们只需先 get 盛放它的 activity ,在使用这个方法即可。 getActivity().runOnUiThread 。使用 RecycleView ,首先要有布局管理器,
LayoutManager ,什么类型的 Manager 主要取决于 recycleView 使用的布局。其次是 RecycleView 的适配器。以下是微博的适配器:
|
|
在Fragment中,我们就要去使用该 RecyleView ,在 Activity 中使用 RecycleView 时候,布局管理器等内容我们要写在 Activity 的 onCreate()
方法中,那么在 Fragment 中,我们就需要写在 onActivityCreated()
这个方法中,这里我们需要传递参数给适配器,所以我们直接在网络操作获取到参数后将它进行传递,故我们只需要在 onActivityCreated()
中调用包含网络操作的 getWeibo()
这个自定义方法即可:
|
|
获取微博每部分的内容不是什么难事。难在了,我们如何把它理想的显示。
我们需要做的显示文本信息并不难,可是单纯显示出来就够了吗?显然,微博信息需要经过很多处理,比如@,##和URL的区别显示。还有九宫格图片的显示,表情的显示。每一块都需要我们单独处理,在下一篇中我们将着重介绍正则表达式处理文本信息。
在处理实体类中有一些坑详见最后一篇微博发布的末尾解释。