网上的文章说的绕的都很晕,希望我这篇文章,你能拿来直接用。不会说过多的原理。
一、navigation的作用
导航的作用,管理fragment如何显示,如何跳转。传统的fragment显示,
有三种方式:
- 直接写在xml中
- 用FragmentTransaction的commit
- 用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
如下图:

<?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也是。
网友评论