20/11/2019, 22:39

Navigation Architect- trong Android JetPack

Mở đầu Thành phần Navigation là một phần của gói AndroidX là giới thiệu kể từ Android SDK 28. Thành phần này bao gồm các cấu trúc cho ứng dụng của bạn, đặc biệt là chuyển hướng giữa các fragment. Nguyên tắc của Navigation : Ứng dụng nên có 1 điểm bắt đầu cố định Chức năng Navigation Up ...

Mở đầu

Thành phần Navigation là một phần của gói AndroidX là giới thiệu kể từ Android SDK 28. Thành phần này bao gồm các cấu trúc cho ứng dụng của bạn, đặc biệt là chuyển hướng giữa các fragment.

Nguyên tắc của Navigation : Ứng dụng nên có 1 điểm bắt đầu cố định Chức năng Navigation Up không bao giờ được thoát ứng dụng của bạn

Cấu hình build.gradle

buildscript {
	...
	repositories {
    		google()
	}
	dependencies {
    		...
    		classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:2.1.0'
	}
}

Implement trong app

implementation 'android.arch.navigation:navigation-fragment:2.1.0'
implementation 'android.arch.navigation:navigation-ui:2.1.0'

**Và apply **

apply plugin: 'androidx.navigation.safeargs'

Xây dựng Ui và chuyển hướng trong app với Navigation

Tạo ACtivity có thẻ Fragment Host làm chủ để dẫn đến các fragment khác

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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_awidth="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_awidth="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/navigation_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

app:navGraph : Định nghĩa file navigation làm chủ các liên hết có ở Host Fragment

app:defaultNavHost="true" .hệ thống navigation chặn việc hệ thống Back ra khỏi app khi ấn nút Back

**Destination : ĐIểm đến khi thực hiện 1 hành động di chuyển ** **Bước đầu tiên ta tạo ra file xml Navigation với Resource type là Navigation ** Chúng ta có thể định nghĩa 1 Action bằng việc kéo thả như sau Hoặc cũng có thể tạo ra các thẻ Action như file sau

<?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"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.FirstFragment"
        tools:layout="@layout/navigation_first_fragment" >
        <action
            android:id="@+id/action_first_Fragment_to_second_Fragment"
            app:destination="@id/secondFragment"
            app:enterAnim="@anim/nav_default_enter_anim"  />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.SecondFragment"
        tools:layout="@layout/navigation_second_fragment" />
</navigation>

**Tiếp đển rebuild app ** Sau đó

Có 2 cách để chuyển hướng đến Fragment khác

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               FindNavController().navigate(FirstFragmentDirections.actionfirstFragmentToSecondFragment()
            }
        });

Truyền argument mỗi khi chuyển hướng . Ví dụ

<fragment
        android:id="@+id/firstFragment"
        android:name="com.FirstFragment"
        android:label="navigation_first_fragment"
        tools:layout="@layout/navigation_first_fragment" >

        <argument
            android:name="test_string"
            android:defaultValue="hello world"
            app:argType="string" />
    </fragment>

sau đó ở Fragment 1

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               findNavController().navigate(
                    firstFragmentDirections.actionFirstFragmentToTwoFragment(
                        "Chuỗi String"
                    )
                )
            }
        });

Nhận ở Fragment 2

private val args: FirstFragmentArgs by navArgs()
//Sau đó ở nơi lấy ra
args.test_string

**Để pop Fragment hiện tại ta dùng . findNavController().popBackStack() ** Khi Chuyển hướng giữa các fragment . navigation cho phép chúng ta tạo bắt được sự kiện sự thay đổi chuyển hướng với destination . Ví dụ

    private lateinit var navController: NavController

  navController = Navigation.findNavController(this, R.id.nav_host_container)
        navController.addOnDestinationChangedListener { _, destination, _ ->
            when (destination.id) {
            R.id.firstFragment->{
            }
            //Todo more
            }

OK . trên đây là những kiến thức về việc chuyển giữa các Fragment sử dụng Navigation . Cảm ơn đã quan tâm và theo dõi . Bye !!

0