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閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

  • 回首頁 第一部分 Drupal簡介 Drupal overview A tour of Drupal fundam...
    王乂閱讀 2,053評論 0 9
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,489評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,682評論 25 708
  • 醉夢仙霖 【詞/凌月挽塵】 引一滴筆墨流轉零亂詞曲 書三闕詩行筆下跳動憂郁 十指縈繞心間 勾畫凋零片段 緣深緣淺 ...
    顧我唯仁閱讀 295評論 0 1
  • 感賞昨晚和兒子一起吃牛排看電影吃爆米花 我知道兒子是喜歡清靜的人,投射自己以后公眾場合不說不該說的話!在家閉嘴,不...
    吳若閱讀 256評論 0 0