主頁 >  其他 > ??即學即用Android Jetpack - Navigation??(從構建到原始碼,十分詳細)

??即學即用Android Jetpack - Navigation??(從構建到原始碼,十分詳細)

2021-08-01 06:46:40 其他

前言

在移動開發中,對開發者來說不同的人具有不同的能力,就像讀一本書一樣,一千個讀者,有一千個哈姆雷特,但不管怎樣,只要你是個軟體開發者你就必須學習windows或Linux等作業系統的運行原理,就不扯這么多了直接上干貨,
【由于文中篇幅較長,提前預告:文末有大量手寫框架原始碼及架構思維資料,需要的可直接跳越至文末領取】

實戰

在實戰之前,我們先來了解一下 Navigation 中最關鍵的三要素,他們是:

  • Navigation Graph (New XML resource)
    如我們的第一張圖所示,這是一個新的資源檔案,用戶在可視化界面可以看出
    他能夠到達的 Destination (用戶能夠到達的螢屏界面),以及流程關系,
  • NavHostFragment (Layou XML view)
    當前 Fragment 的容器
  • NavController (Kotlin/Javaobject)
    導航的控制者

可能我這么解釋還是有點抽象,做一個不是那么恰當的比喻,我們可以將 Navigation Graph 看作一個地圖,
NavHostFragment 看作一個車,以及把 NavController 看作車中的方向盤, Navigation Graph 中可以看出各個地點(Destination)和通往各個地點的路徑, NavHostFragment 可以到達地圖中的各個目的地,但是決定到什么目的地還是方向盤 NavController ,雖然它取決于開車人(用戶),

第一步 添加依賴

模塊層的 build.gradle 檔案需要添加:

ext.navigationVersion = "2.0.0" 
dependencies { 
                //...
               implementation "androidx.navigation:navigation-fragment- ktx:$rootProject.navigationVersion" 
               implementation "androidx.navigation:navigation-ui-ktx:$rootProject.navigationVersion"
 }

如果你要使用 SafeArgs 插件,還要在專案目錄下的 build.gradle 檔案添加:

buildscript { 
      ext.navigationVersion = "2.0.0" 
      dependencies { 
            classpath "androidx.navigation:navigation-safe-args-gradle- plugin:$navigationVersion" 
      } 
}

以及模塊下面的 build.gradle 檔案添加:

apply plugin: 'kotlin-android-extensions' 
apply plugin: 'androidx.navigation.safeargs'

第二步 創建navigation導航

  1. 創建基礎目錄:資源檔案 res 目錄下創建 navigation 目錄 -> 右擊 navigation 目錄New一個 Navigation resource file
  2. 創建一個
Destination

,如果說

navigation

是我們的導航工具,

Destination

是我們的目的地,在此之前,我已經寫好了一個

WelcomeFragment

LoginFragment

RegisterFragment

,添加

Destination

的操作完成后如下所示:

添加Destination

除了可視化界面之外,我們仍然有必要看一下里面的內容組成, login_navigation.xml :

<navigation
      ...
      android:id="@+id/login_navigation"
      app:startDestination="@id/welcome">

      <fragment
          android:id="@+id/login"
          android:name="com.joe.jetpackdemo.ui.fragment.login.LoginFragment"
          android:label="LoginFragment"
          tools:layout="@layout/fragment_login"
          />

       <fragment
          android:id="@+id/welcome"
          android:name="com.joe.jetpackdemo.ui.fragment.login.WelcomeFragment"
          android:label="LoginFragment"
          tools:layout="@layout/fragment_welcome">
          <action
                .../>
          <action
                .../>
          </fragment>

      <fragment
          android:id="@+id/register"
          android:name="com.joe.jetpackdemo.ui.fragment.login.RegisterFragment"    
          android:label="LoginFragment"
          tools:layout="@layout/fragment_register"
          >
          <argument
                .../>
      </fragment>
</navigation>

我在這里省略了一些不必要的代碼,讓我們看一下 navigation標簽 的屬性:

app:startDestination 默認的起始位置

第三步 建立 NavHostFragment

我們創建一個新的 LoginActivity ,在 activity_login.xml 檔案中:

<androidx.constraintlayout.widget.ConstraintLayout
      ...>

      <fragment
          android:id="@+id/my_nav_host_fragment"
          android:name="androidx.navigation.fragment.NavHostFragment"
          app:navGraph="@navigation/login_navigation"
          app:defaultNavHost="true"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

有幾個屬性需要解釋一下:

  • android:name
    值必須是androidx.navigation.fragment.NavHostFragment,宣告這是一個 NavHostFragment
  • app:navGraph
    存放的是第二步建好導航的資源檔案,也就是確定了Navigation Graph
  • app:defaultNavHost="true"
    與系統的回傳按鈕相關聯

第四步 界面跳轉、引數傳遞和影片

在 WelcomeFragment 中,點擊登錄和注冊按鈕可以分別跳轉到 LoginFragment 和 RegisterFragment 中,

WelcomeFragment.
這里我使用了兩種方式實作:

方式一 利用ID導航

目標: WelcomeFragment 攜帶 key 為 name 的資料跳轉到 LoginFragment , LoginFragment 接收后顯示,
Have a account ? Login 按鈕的點擊事件如下:

btnLogin.setOnClickListener {
          // 設定影片引數
          val navOption = navOptions {
                  anim {
                        enter = R.anim.slide_in_right
                        exit = R.anim.slide_out_left
                        popEnter = R.anim.slide_in_left
                        popExit = R.anim.slide_out_right
                  }
          }
          // 引數設定
          val bundle = Bundle()
          bundle.putString("name","TeaOf")
          findNavController().navigate(R.id.login, bundle,navOption)
}

后續 LoginFragment 的接收代碼比較簡單,直接獲取Fragment中的 Bundle 即可,這里不再出示代碼,最后的效
果:

LoginFragment

方式二 利用 Safe Args **

目標: WelcomeFragment 通過 Safe Args 將資料傳到 RegisterFragment , RegisterFragment 接收后顯示,
再看一下已經展示過的 login_navigation.xml :

<navigation
      ...>
      <fragment
          ...
          />

      <fragment
          android:id="@+id/welcome"
          >
          <action
              android:id="@+id/action_welcome_to_login"
              app:destination="@id/login"/>
          <action
              android:id="@+id/action_welcome_to_register"
              app:enterAnim="@anim/slide_in_right"
              app:exitAnim="@anim/slide_out_left"
              app:popEnterAnim="@anim/slide_in_left"
              app:popExitAnim="@anim/slide_out_right"
              app:destination="@id/register"/>
      </fragment>
      <fragment
          android:id="@+id/register"
          ...
          >
          <argument
              android:name="EMAIL"
              android:defaultValue="2005@qq.com"
              app:argType="string"/>
      </fragment>
</navigation>

細心的可能已經觀察到 navigation 目錄下的 login_navigation.xml 資源檔案中的 action 標簽和 argument
標簽,這里需要解釋一下:

  • app:destination
    跳轉完成到達的 fragment 的Id
  • app:popUpTo
    將 fragment 從 堆疊 中彈出,直到某個Id的 fragment

argument標簽

  • android:name
    標簽名字
  • app:argType
    標簽的型別
  • android:defaultValue
    默認值

點擊Android studio中的Make Project按鈕,可以發現系統為我們生成了兩個類:

系統生成的類

WelcomeFragment

中的

JOIN US

按鈕點擊事件:

btnRegister.setOnClickListener {
        val action = WelcomeFragmentDirections
              .actionWelcomeToRegister()
              .setEMAIL("TeaOf1995@Gamil.com")
        findNavController().navigate(action)
}

RegisterFragment 中的接收:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // ...
        val safeArgs:RegisterFragmentArgs by navArgs()
        val email = safeArgs.email
        mEmailEt.setText(email)
}

以及效果:


RegisterFragment
需要提及的是,如果不用

Safe Args

,

action

可以由

Navigation.createNavigateOnClickListener(R.id.next_action, null)

方式生成,感興趣的可以自行撰寫,

更多

Navigation 可以系結 menus 、 drawers 和 bottom navigation ,這里我們以 bottom navigation 為例,我先在
navigation 目錄下新創建了 main_navigation.xml ,接著新建了 MainActivity ,下面則是
activity_main.xml :

<LinearLayout
      ...>
      <fragment
          android:id="@+id/my_nav_host_fragment"
          android:name="androidx.navigation.fragment.NavHostFragment"
          android:layout_width="match_parent"
          app:navGraph="@navigation/main_navigation"
          app:defaultNavHost="true"
          android:layout_height="0dp"
          android:layout_weight="1"/>
      <com.google.android.material.bottomnavigation.BottomNavigationView
          android:id="@+id/navigation_view"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@android:color/white"
          app:itemIconTint="@color/colorAccent"
          app:itemTextColor="@color/colorPrimary"
          app:menu="@menu/menu_main"/>
  </LinearLayout>

MainActivity 中的處理也十分簡單:

class MainActivity : AppCompatActivity() {
          
          lateinit var bottomNavigationView: BottomNavigationView
          
          override fun onCreate(savedInstanceState: Bundle?) {
              //...
              val host: NavHostFragment =
          supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
              val navController = host.navController
              initWidget()
              initBottomNavigationView(bottomNavigationView,navController)
          }

          private fun initBottomNavigationView(bottomNavigationView: BottomNavigationView, navController: NavController) {
              bottomNavigationView.setupWithNavController(navController)
          }
          private fun initWidget() {
              bottomNavigationView = findViewById(R.id.navigation_view)
          }
}

效果:

結束

更多手寫專案原始碼請往下看(文末可直接領取)

  • Data Binding
  • ViewModel & LiveData
  • Room
  • Paging
  • WorkManger
  • Paging 3

MVC/MVP/MVVM

  • MVC框架-ASP.NET表單
  • MVC框架-第一應用程式
  • MVC框架-檔案夾
  • MVC框架-模型
  • MVC框架-控制器
  • MVC框架-視圖
  • MVC框架-布局
  • MVP架構設計:Google官方MVP思想解讀
  • 開源MVP框架
  • MVC、MVP、MVVM,到底該怎么選?

大廠架構演進之路

  • 抖音 iOS 工程架構演進
  • 美團外賣 Android 平臺化架構演進實踐
  • 安居客 Android 專案架構演進
  • 攜程 Android App 插件化和動態加載實踐
  • 微信Android客戶端架構演進之路
  • 千萬級用戶的 Android 客戶端是如何養成的 | 架構師實踐日
  • 手機淘寶構架演化實踐
  • 英語流利說 Android 架構演進

我建立了一個編程資料共享學習Q裙:裙號是793544421,也可直接添加我的唯心:【Keaiduoooo_】,我整理了一系列編程學習視頻、Android技術原理、手寫原始碼、架構思維、書籍、筆記等等,需要文中資料的同學,進群即可獲得,【技術學習交流,廣告勿入】,技術是有邊界的,但是學習是無界的,群里會有一些大神幫忙解答,有時你悶頭想一天,不如別人的三言兩語就醍醐灌頂,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291188.html

標籤:其他

上一篇:Linux 常用的基本命令(Java程式員入門必備)

下一篇:被公司裁掉的我,通過自己的努力拿到了阿里offer(總結)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more