美文网首页
JetPack Navigation NavGraph中的Nav

JetPack Navigation NavGraph中的Nav

作者: 小强开学前 | 来源:发表于2021-09-12 17:21 被阅读0次

先说结论:按 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对象

NavGraphNavDestination节点数据其实全部存在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;
            }
        }
    }

相关文章

网友评论

      本文标题:JetPack Navigation NavGraph中的Nav

      本文链接:https://www.haomeiwen.com/subject/gdktgltx.html