大家好,今天小编来为大家解答手机淘宝网站源码分享这个问题,淘宝app源码很多人还不知道,现在让我们一起来看看吧!
前言
在移动开发中,对开发者来说不同的人具有不同的能力。就像读一本书一样,一千个读者,有一千个哈姆雷特。但不管怎样,只要你是个软件开发者你就必须学习windows或Linux等操作系统的运行原理。就不扯这么多了直接上干货。【由于文中篇幅较长,提前预告:文末有大量手写框架源码及架构思维资料,需要的可直接跳越至文末领取】
实战
在实战之前,我们先来了解一下Navigation中最关键的三要素,他们是:
NavigationGraph(NewXMLresource)如我们的第一张图所示,这是一个新的资源文件,用户在可视化界面可以看出他能够到达的Destination(用户能够到达的屏幕界面),以及流程关系。NavHostFragment(LayouXMLview)当前Fragment的容器NavController(Kotlin/Javaobject)导航的控制者
可能我这么解释还是有点抽象,做一个不是那么恰当的比喻,我们可以将NavigationGraph看作一个地图,NavHostFragment看作一个车,以及把NavController看作车中的方向盘,NavigationGraph中可以看出各个地点(Destination)和通往各个地点的路径,NavHostFragment可以到达地图中的各个目的地,但是决定到什么目的地还是方向盘NavController,虽然它取决于开车人(用户)。
第一步添加依赖
模块层的build.gradle文件需要添加:
ext.navigationVersion=&34;\ndependencies{\n//…\nimplementation&34;\nimplementation&34;\n}\n
如果你要使用SafeArgs插件,还要在项目目录下的build.gradle文件添加:
buildscript{\next.navigationVersion=&34;\ndependencies{\nclasspath&34;\n}\n}\n
以及模块下面的build.gradle文件添加:
applyplugin:&39;\napplyplugin:&39;\n
第二步创建navigation导航
创建基础目录:资源文件res目录下创建navigation目录->右击navigation目录New一个Navigationresourcefile创建一个
Destination\n
,如果说
navigation\n
是我们的导航工具,
Destination\n
是我们的目的地,在此之前,我已经写好了一个
WelcomeFragment\n
、
LoginFragment\n
和
RegisterFragment\n
,添加
Destination\n
的操作完成后如下所示:
添加Destination
除了可视化界面之外,我们仍然有必要看一下里面的内容组成,login_navigation.xml:
<navigation\n…\nandroid:id=&34;\napp:startDestination=&34;>\n\n<fragment\nandroid:id=&34;\nandroid:name=&34;\nandroid:label=&34;\ntools:layout=&34;\n/>\n\n<fragment\nandroid:id=&34;\nandroid:name=&34;\nandroid:label=&34;\ntools:layout=&34;>\n<action\n…/>\n<action\n…/>\n</fragment>\n\n<fragment\nandroid:id=&34;\nandroid:name=&34;\nandroid:label=&34;\ntools:layout=&34;\n>\n<argument\n…/>\n</fragment>\n</navigation>\n
我在这里省略了一些不必要的代码。让我们看一下navigation标签的属性:
app:startDestination默认的起始位置
第三步建立NavHostFragment
我们创建一个新的LoginActivity,在activity_login.xml文件中:
<androidx.constraintlayout.widget.ConstraintLayout\n…>\n\n<fragment\nandroid:id=&34;\nandroid:name=&34;\napp:navGraph=&34;\napp:defaultNavHost=&34;\nandroid:layout_width=&34;\nandroid:layout_height=&34;/>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n
有几个属性需要解释一下:
android:name值必须是androidx.navigation.fragment.NavHostFragment,声明这是一个NavHostFragmentapp:navGraph存放的是第二步建好导航的资源文件,也就是确定了NavigationGraphapp:defaultNavHost=&34;与系统的返回按钮相关联
第四步界面跳转、参数传递和动画
在WelcomeFragment中,点击登录和注册按钮可以分别跳转到LoginFragment和RegisterFragment中。
WelcomeFragment.这里我使用了两种方式实现:
方式一利用ID导航
目标:WelcomeFragment携带key为name的数据跳转到LoginFragment,LoginFragment接收后显示。Haveaaccount?Login按钮的点击事件如下:
btnLogin.setOnClickListener{\n//设置动画参数\nvalnavOption=navOptions{\nanim{\nenter=R.anim.slide_in_right\nexit=R.anim.slide_out_left\npopEnter=R.anim.slide_in_left\npopExit=R.anim.slide_out_right\n}\n}\n//参数设置\nvalbundle=Bundle()\nbundle.putString(&34;,&34;)\nfindNavController().navigate(R.id.login,bundle,navOption)\n}\n
后续LoginFragment的接收代码比较简单,直接获取Fragment中的Bundle即可,这里不再出示代码。最后的效果:
?
LoginFragment
方式二利用SafeArgs**
目标:WelcomeFragment通过SafeArgs将数据传到RegisterFragment,RegisterFragment接收后显示。再看一下已经展示过的login_navigation.xml:
<navigation\n…>\n<fragment\n…\n/>\n\n<fragment\nandroid:id=&34;\n>\n<action\nandroid:id=&34;\napp:destination=&34;/>\n<action\nandroid:id=&34;\napp:enterAnim=&34;\napp:exitAnim=&34;\napp:popEnterAnim=&34;\napp:popExitAnim=&34;\napp:destination=&34;/>\n</fragment>\n<fragment\nandroid:id=&34;\n…\n>\n<argument\nandroid:name=&34;\nandroid:defaultValue=&34;\napp:argType=&34;/>\n</fragment>\n</navigation>\n
细心的可能已经观察到navigation目录下的login_navigation.xml资源文件中的action标签和argument标签,这里需要解释一下:
app:destination跳转完成到达的fragment的Idapp:popUpTo将fragment从栈中弹出,直到某个Id的fragment
argument标签
android:name标签名字app:argType标签的类型android:defaultValue默认值
点击Androidstudio中的MakeProject按钮,可以发现系统为我们生成了两个类:
?
系统生成的类
WelcomeFragment\n
中的
JOINUS\n
按钮点击事件:
btnRegister.setOnClickListener{\nvalaction=WelcomeFragmentDirections\n.actionWelcomeToRegister()\n.setEMAIL(&34;)\nfindNavController().navigate(action)\n}\n
,
RegisterFragment中的接收:
overridefunonViewCreated(view:View,savedInstanceState:Bundle?){\nsuper.onViewCreated(view,savedInstanceState)\n\n//…\nvalsafeArgs:RegisterFragmentArgsbynavArgs()\nvalemail=safeArgs.email\nmEmailEt.setText(email)\n}\n
以及效果:
?
RegisterFragment需要提及的是,如果不用
SafeArgs\n
,
action\n
可以由
Navigation.createNavigateOnClickListener(R.id.next_action,null)\n
方式生成,感兴趣的可以自行编写。
更多
Navigation可以绑定menus、drawers和bottomnavigation,这里我们以bottomnavigation为例,我先在navigation目录下新创建了main_navigation.xml,接着新建了MainActivity,下面则是activity_main.xml:
<LinearLayout\n…>\n<fragment\nandroid:id=&34;\nandroid:name=&34;\nandroid:layout_width=&34;\napp:navGraph=&34;\napp:defaultNavHost=&34;\nandroid:layout_height=&34;\nandroid:layout_weight=&34;/>\n<com.google.android.material.bottomnavigation.BottomNavigationView\nandroid:id=&34;\nandroid:layout_width=&34;\nandroid:layout_height=&34;\nandroid:background=&34;\napp:itemIconTint=&34;\napp:itemTextColor=&34;\napp:menu=&34;/>\n</LinearLayout>\n
MainActivity中的处理也十分简单:
classMainActivity:AppCompatActivity(){\n\nlateinitvarbottomNavigationView:BottomNavigationView\n\noverridefunonCreate(savedInstanceState:Bundle?){\n//…\nvalhost:NavHostFragment=\nsupportFragmentManager.findFragmentById(R.id.my_nav_host_fragment)asNavHostFragment\nvalnavController=host.navController\ninitWidget()\ninitBottomNavigationView(bottomNavigationView,navController)\n}\n\nprivatefuninitBottomNavigationView(bottomNavigationView:BottomNavigationView,navController:NavController){\nbottomNavigationView.setupWithNavController(navController)\n}\nprivatefuninitWidget(){\nbottomNavigationView=findViewById(R.id.navigation_view)\n}\n}\n
效果:
?
结束
更多手写项目源码请往下看(文末可直接领取)
DataBindingViewModel&LiveDataRoomPagingWorkMangerPaging3
?
MVC/MVP/MVVM
MVC框架-ASP.NET窗体MVC框架-第一应用程序MVC框架-文件夹MVC框架-模型MVC框架-控制器MVC框架-视图MVC框架-布局MVP架构设计:Google官方MVP思想解读开源MVP框架MVC、MVP、MVVM,到底该怎么选?
?
大厂架构演进之路
抖音iOS工程架构演进美团外卖Android平台化架构演进实践安居客Android项目架构演进携程AndroidApp插件化和动态加载实践微信Android客户端架构演进之路千万级用户的Android客户端是如何养成的|架构师实践日手机淘宝构架演化实践英语流利说Android架构演进
?
我整理了一系列编程学习视频、Android技术原理、手写源码、架构思维、书籍、笔记等等,需要文中资料的同学,可私信我回复学习,技术是有边界的,但是学习是无界的,群里会有一些大神帮忙解答,有时你闷头想一天,不如别人的三言两语就醍醐灌顶。
?
关于本次手机淘宝网站源码分享和淘宝app源码的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
