java match parent_Jetpack 实战Java(一)写Java版的sunflower 分析Java版本

本文介绍了如何使用Jetpack的Navigation组件在Java项目中构建UI。讲解了Navigation Graph、NavHostFragment和NavController的作用,展示了如何创建Navigation Resource File,添加NavHostFragment到布局中,以及如何通过可视化方式创建和链接页面。此外,还提到了如何设置页面切换动画。
摘要由CSDN通过智能技术生成

我们用的是标准jetpack套件,所以我们采用DataBinding,并且,项目结构是一个抽屉布局和主页面

9bd73edeb233

2021-01-30 15.35.54.png

Navigation的主要元素

Navigation的主要元素有如下三个:

Navigation Graph。一种xml资源文件,里面包含需要统一管理的所有页面以及页面之间的关系。

NavHostFragment。一种特殊的Fragment,是其他Fragment的容器,在Navigation Graph中的Fragment是通过NavHostFragment进行展示的。

NavController。用于在代码中完成Navigation Graph中具体的页面切换工作。

上述三者关系为:在切换Fragment时,使用NavController对象,告知其要去Navigation Graph中的哪个Fragment;NavController会将这个Fragment展示在NavHostFragment中。

用Navigation创建UI

在res文件夹下创建navigation目录,然后在这个新建的navigation目录下创建一个Navigation Resource File文件

9bd73edeb233

2021-01-30 15.27.03.png

File name设为nav_graph,Root element用默认的navigation。生成之后Android Studio会询问是否自动添加相关依赖,单击OK,等待依赖添加完成。

NavHostFragment是一种特殊的Fragment,所以需要将其添加到其依托的Activity布局文件中。在NavHostFragment依托的Activity布局文件下。

DataBinding+DrawLayout+NavHostFragment+NavigationView

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools">

android:id="@+id/drawer_layout"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/appbar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:theme="@style/AppTheme.AppBarOverlay">

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:popupTheme="@style/AppTheme.PopupOverlay"/>

android:id="@+id/garden_nav_fragment"

android:name="androidx.navigation.fragment.NavHostFragmen"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:defaultNavHost="true"

app:navGraph="@navigation/nav_graph"

/>

android:id="@+id/navigation_view"

style="@style/Widget.MaterialComponents.NavigationView"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_gravity="start"

app:headerLayout="@layout/nav_header"

app:menu="@menu/menu_navigation" />

需要注意的是android:name属性为固定写法,告知系统这是一个特殊的Fragment;app:defaultNavHost设置为true,此时当用户按下返回键时,系统自动将当前所展示的Fragment退出;app:navGraph属性用来设置这个Fragment对应的导航图。

回到nav_graph导航图上,可以看到上面设置的NavHostFragment

创建destination。这个部分有点像Xcode的StoryBoard,可以利用可视化的方式直观展示页面关系。

9bd73edeb233

2021-01-29 19.50.05.png

(这里也可以利用代码直接关联已有的页面),可以是Fragment,也可以是Activity,但是Fragment更为常见。我们代码结构创建一个Activity,剩下全是Fragment结构

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/nav_graph"

app:startDestination="@id/gardenFragment">

android:id="@+id/gardenFragment"

android:name="top.zcwfeng.sunflower_java.GardenFragment"

android:label="fragment_garden"

tools:layout="@layout/fragment_garden" >

android:id="@+id/action_gardenFragment_to_planDetail"

app:destination="@id/planDetail" />

......

navigation标签下多了一个app:startDestination属性,这个属性指定了起始的destination

实现Fragment页面的切换。使用上面的方法创建一个PlanDetailFragment,然后回到nav_graph导航图。

9bd73edeb233

2021-01-29 20.09.40.png

用鼠标选中gardenFragment,拖动右面的小圆圈,使其指向planDetailFragment

9bd73edeb233

2021-01-29 20.10.45.png

查看源码,可以看到多了一个action标签。里面有个app:destination属性,表明其目的地是PlanDetailFragment

添加页面切换动画效果

和普通的写法一样,这里也同样支持添加切换页面的动画效果。

在res/anim目录下加入动画文件

slide_in_left:

android:fromYDelta="0%" android:toYDelta="0%"

android:duration="@integer/slide"/>

-----------------

slide_in_right:

android:fromYDelta="0%" android:toYDelta="0%"

android:duration="@integer/slide"/>

-----------------

slide_out_left:

android:fromYDelta="0%" android:toYDelta="0%"

android:duration="@integer/slide"/>

-----------------

slide_out_right:

android:fromYDelta="0%" android:toYDelta="0%"

android:duration="@integer/slide"/>

之后,回到nav_graph导航图,在Design面板中设置动画文件。

9bd73edeb233

2021-01-30 21.44.16.png

android:id="@+id/gardenFragment"

...>

android:id="@+id/action_gardenFragment_to_planDetail"

app:destination="@id/planDetail"

app:enterAnim="@anim/slide_in_right"

app:exitAnim="@anim/slide_out_left"

app:popEnterAnim="@anim/slide_in_left"

app:popExitAnim="@anim/slide_in_right" />

android:id="@+id/planDetail"

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值