Navigation
“导航” 页面切换(处理导航图所需的一切,包括页面的跳转、参数的传递、动画效果的设置,以及Appbar的设置等)
NavHost是个容器,也是个控制器
Fragment
NavController
NavGraph
简单页面切换 完整例子:
新建各Empty Activity,起名MainActivity
新建两个Blank类型的Fragment,布局加个按钮用来点击跳转
新建
Android Resource File
,类型Navigation,起名nav点击
New Destination
按钮,添加前面创建的fragment布局,拖动进行关联(会有action,action有唯一id)此时的nav布局文件缺少HOST
activity_main.xml移除掉内容,添加
NavHostFragment
,关联上前面创建的nav.xml
,这样nav.xml
中就有HOST了fragment中在onActivityCreate函数中添加控件的点击事件。点击事件中要关联上前面nav.xml的action
1
2
3
4
5view!!.findViewById<Button>(R.id.button).setOnClickListener{
val navController: NavController = Navigation.finNavController(it)
//其中的actionId可以换成第二个页面的id,但推荐使用actionId
navController.navigate(R.id.action_homeFragment_to_defaultFragment)
}
MainActivity.kt
1 | class MainActivity : AppCompatActivity() { |
activity_main.xml
1 |
|
HomeFragment.java
1 | public class HomeFragment extends Fragment { |
fragment_home.xml
1 |
|
nav.xml
1 |
|
页面切换并传递数据
方式1:用argument 传递简单的,静态的数据
nav.xml
中在接收数据的defaultFragment中,选中defaultFragment在右侧点击Arguments旁边的“+”,在弹窗中添加Name为name、Type为String、Default Value为Jack
nav.xml
中选中action的线,在右侧的Argument Default Values
中添加默认值“Tome”- 在页面跳转的时候会自动带过去(记得此时页面跳转用的是actionId,即
controller.navigate(actionId)
)
方式2:用Bundle传递动态数据
在要传递的页面中
HomeFragment.java
的onActivityCreated
中添加1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16getView().findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EditText editText = getView().findViewById(R.id.editText);
String str = editText.getText().toString();
if (TextUtils.isEmpty(str)){
Toast.makeText(getActivity(), "请输入名字!", Toast.LENGTH_SHORT).show();
}
Bundle bundle = new Bundle();
//放进的是key-value
bundle.putString("myName", str);
NavController controller = Navigation.findNavController(v);
//第一个参数是actionId,第二个参数是Bundle里面带有要传递过去的内容
controller.navigate(R.id.action_homeFragment_to_defaultFragment, bundle);
}
});接收的
DefaultFragment.java
的onActivityCreated
中1
2//getString中是key
String str = getArguments().getString("myName");
心算应用
包含:ViewModel、Screen Orientation 横竖屏切换、LiveData、Localization 资源国际适配、DataBinding、Vector Drawable、ViewModelSavedState、Navigation、补间动画
app/build.gradle
1 | apply plugin: 'com.android.application' |
数据管理
MyViewModel.java
数据管理
1 | import android.app.Application; |
欢迎页面
MainActivity.java
加载多个fragment
的容器
1 | import androidx.appcompat.app.AppCompatActivity |
activity_main.xml
1 |
|
nav.xml
自动加载第一个TitleFragment
,即自动显示第一个TitleFragment
而不会显示activity_main.xml
内容
1 | import android.os.Bundle; |
fragment_title.xml
1 |
|
路由管理
nav.xml
1 |
|
其中的补间动画
slide_from_left.xml
1 |
|
答题页面
1 | package com.ab.calculationtest; |
fragment_question.xml
1 |
|
dimens.xml
尺寸
1 |
|
胜利页面
1 | import android.os.Bundle; |
1 |
|
失败页面
1 | import android.os.Bundle; |
1 |
|
资源国际化
values/strings.xml
1 | <resources> |
values-zh-rCN/strings.xml
1 |
|