Jectpack之navigation

作者: 你的益达233 | 来源:发表于2021-08-02 16:30 被阅读0次

网上的文章说的绕的都很晕,希望我这篇文章,你能拿来直接用。不会说过多的原理。

一、navigation的作用

导航的作用,管理fragment如何显示,如何跳转。传统的fragment显示,
有三种方式:

  1. 直接写在xml中
  2. 用FragmentTransaction的commit
  3. 用viewpager

现在多了一种navigation来管理fragment

二、navigation的使用

navigation的使用就类似一张地图setGraph,地图上有目的地nav_simplexml,然后开车getNavController驶去
上面一句话就是使用的根本了,好好体会

步骤1、引入依赖
//Navigation
implementation "android.arch.navigation:navigation-fragment:1.0.0-alpha02"
implementation "android.arch.navigation:navigation-ui:1.0.0-alpha02"
步骤2、新建地图,即nav_simplexml

在res目录下新建navigation文件夹,再建navigation.xml
如下图:

nv1.png
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/nav_simple_first_frag">
<fragment
    android:id="@+id/nav_simple_first_frag"
    android:name="com.ce.navigationtest.simple.FirstFragment"
    android:label="first frag"
    tools:layout="@layout/fragment_simple_first">
    <!--<action
        android:id="@+id/action_nav_first_frag_to_nav_second_frag"
        app:destination="@id/nav_simple_second_frag"
        app:enterAnim="@anim/fade_in"
        app:exitAnim="@anim/fade_out"
        app:popEnterAnim="@anim/fade_in"
        app:popExitAnim="@anim/fade_out"/>-->
    <action
        android:id="@+id/action_nav_first_frag_to_nav_second_frag"
        app:destination="@id/nav_simple_second_frag" />
    <argument android:name="data" app:type="string" />
</fragment>
<fragment
    android:id="@+id/nav_simple_second_frag"
    android:name="com.ce.navigationtest.simple.SecondFragment"
    android:label="second frag"
    tools:layout="@layout/fragment_simple_second">
    <action
        android:id="@+id/action_nav_second_frag_to_nav_third_frag"
        app:destination="@id/nav_simple_third_frag" />
    <argument android:name="booleanData" app:type="boolean" />
    <!--<argument android:name="byteData" app:type="byte" />-->
    <!--<argument android:name="charData" app:type="char" />-->
    <!--<argument android:name="shortData" app:type="short" />-->
    <argument android:name="intData" app:type="integer" />
    <!--<argument android:name="longData" app:type="long" />-->
    <argument android:name="floatData" app:type="float" />
    <!--<argument android:name="doubleData" app:type="double" />-->
    <argument android:name="stringData" app:type="string" />
</fragment>
<fragment
    android:id="@+id/nav_simple_third_frag"
    android:name="com.ce.navigationtest.simple.ThirdFragment"
    android:label="third frag"
    tools:layout="@layout/fragment_simple_third">
    <action
        android:id="@+id/action_nav_third_frag_to_nav_fourth_frag"
        app:destination="@id/nav_simple_fourth_frag" />
</fragment>
<fragment
    android:id="@+id/nav_simple_fourth_frag"
    android:name="com.ce.navigationtest.simple.FourthFragment"
    android:label="fourth frag"
    tools:layout="@layout/fragment_simple_fourth">
</fragment>
</navigation>

注:用不到传值的可以删掉action

步骤3、Activity的配置

activity_simple.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".simple.SimpleActivity">

<fragment
    android:id="@+id/frag_nav_simple"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true" />
</android.support.constraint.ConstraintLayout>

NavHostFragment是地图的fragment,它上面装载着其他fragment

步骤4、具体的使用
public class SimpleActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple);
     


        NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.frag_nav_simple);
        NavGraph navSimple = navHostFragment.getNavController().getNavInflater().inflate(R.navigation.nav_simple);
        NavDestination firstFragDestination = navSimple.findNode(R.id.nav_simple_first_frag);
        FirstFragmentArgs fragmentArgs = new FirstFragmentArgs.Builder("给 First 的数据").build();
        firstFragDestination.setDefaultArguments(fragmentArgs.toBundle());
        navHostFragment.getNavController().setGraph(navSimple);
    }

    @Override
    public boolean onSupportNavigateUp() {
        return Navigation.findNavController(this, R.id.frag_nav_simple).navigateUp();
    }
}  

至此示例代码就完成了,FirstFragment等fragment换成你的即可,大部分代码参考网上。重点理解地图,目的地,如何控制跳转的概念。

我也解决了navigation的fragment每次切换重建的问题,有需要私聊我。要demo也是。

相关文章

网友评论

    本文标题:Jectpack之navigation

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