先说结论:按 id 值从小到大排序
而 id 是xml里指定的@+id/xxxFragment
安卓打包时 aapt 会根据 id 名称字母排序从小到大分配id值
部分测试代码:
navController.graph.forEach { dest ->
"label:${dest.label}".log()
}
证( sample1 ):
| 名称 | 结果 |
|---|---|
Demo1Fragment(@+id/demo1Fragment)Demo2Fragment(@+id/demo2Fragment)Demo3Fragment(@+id/demo3Fragment)MainFragment(@+id/MainFragment) |
1 2 3 main |
证( sample2):
仅仅修改
Demo1Fragment类名为Demo4Fragment
| 名称 | 结果 |
|---|---|
Demo4Fragment(@+id/demo1Fragment)Demo2Fragment(@+id/demo2Fragment)Demo3Fragment(@+id/demo3Fragment)MainFragment(@+id/MainFragment) |
1 2 3 main |
证( sample3):
仅仅修改
Demo1FragmentID为demo4Fragment
| 名称 | 结果 |
|---|---|
Demo1Fragment(@+id/demo4Fragment)Demo2Fragment(@+id/demo2Fragment)Demo3Fragment(@+id/demo3Fragment)MainFragment(@+id/MainFragment) |
2 3 1 main |
证( sample4):
仅仅修改
MainFragmentID为aMainFragment
| 名称 | 结果 |
|---|---|
Demo1Fragment(@+id/demo1Fragment)Demo2Fragment(@+id/demo2Fragment)Demo3Fragment(@+id/demo3Fragment)MainFragment(@+id/aMainFragment) |
main 1 2 3 |
以下为具体分析
Navigation相关调用流程
-
Activity#setContentView解析属性,生成NavHostFragment -
NavHostFragment#onCreate创建NavHostController -
NavHostFragment#onCreate调用NavHostController#setGraph -
NavHostController#setGraph调用NavInflater#inflate解析xml生成NavGraph对象
NavGraph中NavDestination节点数据其实全部存在mNodes中
final SparseArrayCompat<NavDestination> mNodes = new SparseArrayCompat<>();
而这个SparseArrayCompat类似HashMap,只是Key固定是int类型
private int[] mKeys;
private Object[] mValues;
由这两个数组完成所有内部逻辑
源码简化
public T get(int key, T defaultValue) {
int i = mKeys.indexOf(key);
if (i < 0 || mValues[i] == DELETED) {
return defaultValue;
} else {
return (T) mValues[i];
}
}
public void remove(int key) {
int i = mKeys.indexOf(key);
if (i >= 0) {
if (mValues[i] != DELETED) {
mValues[i] = DELETED;
mGarbage = true;
}
}
}










网友评论