RxAndroid + Retrofit + Databinding 之仿推酷 app 实战系列 2

上一篇已经对首页的结构进行了简单的分析,从今天开始,码,编起来。

侧滑菜单


The story begins: long long ago...

真的不夸张,已经好久没有看到到过侧滑君 SlidingMenu 了, 最后一次见到它还是在 Eclipse 时代。在官方推出侧滑之前,侧滑君统治了半壁江山。从推酷应用就可以看出,它是一个典型的 meterial design 风格的应用。因此,侧滑菜单控件就选用官方 DrawerLayout + NavigationView 的组合方式。

使用 AS 创建这种组合的 Activity 页面还是灰常简单。点击菜单:File -> New -> Activity,选择 Navigation Drawer Activity,然后,符合要求的 Activity 便创建出来了(也可以在新建项目时,把默认创建的 Activity 选择为 Navigation Drawer Activity)。编译完成后,将生成的页面设置为项目的启动页面,运行项目。你将发现,模拟器上显示的页面,除了需要的侧滑外,Toolbar 也有了,还多了一个红色的浮动按钮,如图所示:

侧滑菜单
首页

是不是已经很像了?当然,不同之处还是有很多。经过对比,侧滑菜单上需要修改的地方有两大类:

  1. 菜单项名称、菜单项图标,菜单项点击后的颜色
  2. 头部的背景、布局

既然找到了不同,那就马上开始修改。

头部修改


NavigationView 控件有两个主要的属性:app:headLayoutapp:menu,分别用来设置:头部的布局,菜单项内容。

打开 app:headLayout 属性指定的布局文件 nav_header_main.xml。在推酷应用中,这里应该显示用户的圆形头像,和登录/注册的操作。上一篇中提到,圆形头像的控件使用 vinc3m1/RoundedImageView 这个控件。打开 GitHub 网站,找到这个控件,按照说明将布局文件中的 ImageView 控件替换掉。然后从反编译后的资源文件中,找到默认显示的头像图片。当然,别忘了修改头部的背景。最后,将图片下的两个 TextVew 修改为一个,并设置样式。最终的结果和 xml 文件内容如下:

侧滑头部
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="@dimen/nav_header_height"
    android:background="@mipmap/left_head_1"
    android:orientation="vertical"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <com.makeramen.roundedimageview.RoundedImageView
        android:id="@+id/imageView1"
        android:layout_width="68dp"
        android:layout_height="68dp"
        android:src="@mipmap/menu_user"
        android:scaleType="fitCenter"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="20dp"
        app:riv_corner_radius="30dip"
        app:riv_border_width="0dip"
        app:riv_border_color="#333333"
        app:riv_mutate_background="true"
        app:riv_tile_mode="clamp"
        app:riv_oval="true" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="@string/register_login"
        android:layout_marginLeft="30dp"
        android:textSize="14sp"
        android:textColor="@android:color/white"/>

</LinearLayout>

菜单项修改


与头部一样,首先找到 app:menu 属性指定的菜单文件 activity_main_drawer.xml。该文件的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_camera"
            android:icon="@drawable/ic_menu_camera"
            android:title="Import"/>
        <item
            android:id="@+id/nav_gallery"
            android:icon="@drawable/ic_menu_gallery"
            android:title="Gallery"/>
        <item
            android:id="@+id/nav_slideshow"
            android:icon="@drawable/ic_menu_slideshow"
            android:title="Slideshow"/>
        <item
            android:id="@+id/nav_manage"
            android:icon="@drawable/ic_menu_manage"
            android:title="Tools"/>
    </group>

    <item android:title="Communicate">
        <menu>
            <item
                android:id="@+id/nav_share"
                android:icon="@drawable/ic_menu_share"
                android:title="Share"/>
            <item
                android:id="@+id/nav_send"
                android:icon="@drawable/ic_menu_send"
                android:title="Send"/>
        </menu>
    </item>

</menu>

该文件分为两部分:groupitem。这两部分的区别在于:

  • 菜单项点击后背景颜色会发生变化,再次打开菜单时
    • group 下的菜单项的颜色仍然保持选中的状态,并且字体颜色也有变化
    • item 下菜单项的背景颜色会恢复点击前的颜色,并且字体颜色不会发生变化
  • android:title 属性
    • item 有该属性且必须设置,设置后会在界面上显示属性的值
    • group 没有该属性

推酷应用的表现与上述的文件有所不同,不同之处在于,分隔线下的菜单项是没有标题的。因为,标题对于 item 来说,是必须的属性,因此,我们可以知道,下面的菜单不是使用 item 进行组织。menu 的直接子元素只能是 groupitem,所以下载的菜单项肯定是包含在 group 中的。

修改完标签,接下来修改菜单项的图标、文字和文字颜色。修改后的效果和文件如下:

侧滑下部
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_menu_home"
            android:title="@string/home"/>
        <item
            android:id="@+id/nav_site"
            android:icon="@drawable/ic_menu_site"
            android:title="@string/site"/>
        <item
            android:id="@+id/nav_topic"
            android:icon="@drawable/ic_menu_topic"
            android:title="@string/topic"/>
        <item
            android:id="@+id/nav_weekly"
            android:icon="@drawable/ic_menu_weekly"
            android:title="@string/weekly"/>
        <item
            android:id="@+id/nav_mine"
            android:icon="@drawable/ic_menu_mine"
            android:title="@string/mine"/>
    </group>

    <group android:id="@+id/group_func">
        <item
            android:id="@+id/nav_mode"
            android:title="@string/night_mode"/>
        <item
            android:id="@+id/nav_offline_download"
            android:title="@string/offline_download"/>
        <item
            android:id="@+id/nav_settings"
            android:title="@string/settings"/>
    </group>

</menu>

修改时的注意事项:

  1. 两个 group 元素都必须设置 id 属性,要不然分隔线出不来
  2. 上面的 group 元素需要设置 android:checkableBehavior="single" 这个属性,要不然点击菜单项后(这是侧滑菜单收起了)再次打开菜单时,原来的选中状态会丢失

主页面


主页面的结构大家应该都很熟悉吧,腾讯新闻、网易新闻、新闻资讯这些软件都有着同样的结构,而且推酷的主页面还比它们少了底部导航,更加简单了。这种结构最典型的实现就是:Toolbar + ViewPager

去掉 FAB(FloatingActionBar)


就是去掉那个红色的浮动按钮。这个超级简单,在整个工程中搜索 FloatingActionBar,就可以找到相应的布局文件和 Java 文件的相关引用,删除就行了。

修改 Toolbar

修改背景色


系统为我们生成的 Toolbar 颜色是蓝色,这是和当前的主题相关。同时,系统在 styles.xml 文件中,为我们生成了如下样式:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

colors.xml 文件中,为我们生成了以下颜色:

<color name="colorPrimary">#389884</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>

以上这三种颜色控制的部分分别如下:

  • colorPrimary 对应 ActionBar 的颜色。
  • colorPrimaryDark 对应状态栏的颜色
  • colorAccent 对应 EditText 编辑时、RadioButton 选中、CheckBox 等选中时的颜色。

根据上面的解析可知:要改变 Toolbar 的背景颜色,只需要修改 colorPrimary 的值就可以了。

去掉 5.0 及以上版本的阴影


现在的菜单在 5.0 以下的版本上是没有任何问题的,但在 5.0 及以上的版本中有一点点小瑕疵:Toolbar 的下边缘有阴影效果。有人说这不算瑕疵,这是官方的亮点效果。但是,每种效果都需要放在合适的环境才能发挥它最大的效果,放在不合适的环境就是败笔了。

好了,闲话少说,直接上解决办法:在 xml 中,在 AppBarLayout 组件上,设置属性:app:elevation="0dp" 即可。

修改弹出菜单


  • 弹出菜单的内容不对,先改之。打开 res -> menu -> main.xml 文件,修改即可,完成后的效果和文件内容如下:
弹出菜单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_chinese"
        android:orderInCategory="100"
        android:title="@string/only_chinese"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_english"
        android:orderInCategory="100"
        android:title="@string/only_english"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_mixture"
        android:orderInCategory="100"
        android:title="@string/mix_chinese_english"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_recommend_settings"
        android:orderInCategory="100"
        android:title="@string/recommond_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_custom_channel"
        android:orderInCategory="100"
        android:title="@string/custom_channel"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_week_miss"
        android:orderInCategory="100"
        android:title="@string/week_miss"
        app:showAsAction="never"/>
</menu>
  • 在测试的过程中,发现一个小问题:点击手机上的 Menu 键,黑色主题的菜单从底部升起,菜单内容与 Toolbar 上菜单显示的内容一样。修改办法:拦截系统 Menu 按键动作。代码如下:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

添加搜索图标


从反编译的包中找到搜索图标:abc_ic_search_api_mtrl_alpha.png。添加的方式是在 res -> menu -> main.xml 添加 item 字段,要注意的是这个属性: app:showAsAction="ifRoom",代码如下:

<item
        android:id="@+id/action_search"
        android:orderInCategory="7"
        android:title=""
        android:icon="@mipmap/white_search"
        app:showAsAction="ifRoom"/>

注意:title 属性是必须的。设置了 title 属性的问题是:长按搜索按钮后,会弹出一个黑色的提示框。可能控件本身就是这样的,因为推酷客户端也有同样的问题。

效果


首页的界面终于修改完了,让我们来看下效果吧:

首页效果
侧滑菜单效果

下期预告


整整花了两篇文章才把页面整清楚,至于与标题相关的技术一个都没有提到。肯定有人会说:标题党来了,大家快跑。大家不要心急,其实,界面也很重要哦。虽然现在没有做功能,但至少它可以让我们看起来很爽。

Warning :一大波干货正在接近……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 回首页 第一部分 Drupal简介 Drupal overview A tour of Drupal fundam...
    王乂阅读 1,998评论 0 9
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,351评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,429评论 25 707
  • 醉梦仙霖 【词/凌月挽尘】 引一滴笔墨流转零乱词曲 书三阙诗行笔下跳动忧郁 十指萦绕心间 勾画凋零片段 缘深缘浅 ...
    顾我唯仁阅读 282评论 0 1
  • 感赏昨晚和儿子一起吃牛排看电影吃爆米花 我知道儿子是喜欢清静的人,投射自己以后公众场合不说不该说的话!在家闭嘴,不...
    吴若阅读 252评论 0 0