Navigation Architecture Component에서 사용할 수 있다는 예감

11623 단어 AndroidKotlin
안녕, m_사키입니다.
Google I/O 2018이 추가되었습니다Navigation Architecture Component
에서 설명한 대로 해당 매개변수의 값을 수정합니다.
제가 먼저 말할 수 있도록 허락해 주세요.상당히 편리합니다!!
지금까지 나는 여러 개의 Fragment Transaction의 처리가 복잡하고 난해해진 프로젝트를 겪었다. "no more fragment transaction!!!"예.
해냈어, 구글 씨!!
뭘 할 수 있다고 하면 이름처럼 Fragment를 할 수 있는 Navigatin!w
정부의 언어를 빌려 쓰면 과도 처리의 실현을 간소화할 수 있다.
The Navigation Architecture Component simplifies the implementation of navigation in an Android app.
이번에는 아래 화면으로 이미지를 만들어 보도록 하겠습니다.
로그인 화면

홈 화면 → 프로필 화면

화면 설정

환경


Android Studio 3.2.1(3.2 Preview 버전 필수)
Kotlin

builde.gradle


project/build.gradle 설정
build.gradle
dependencies {
        classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01"

        ...
}
repositories {
        google()

        ...
}
app/build.gradle 설정
build.gradle
apply plugin: "androidx.navigation.safeargs"

dependencies {
    def nav_version = "1.0.0-alpha01"
    implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
    implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin

    ...
}

Navigation Resource


AndroidStudio3.2에 새로 추가된 탐색 리소스 추가


프로젝트의res 디렉터리에서 오른쪽 단추 클릭 → New → AndroidResourceFile를 선택하여 다음 OK 단추로 설정하십시오
File name : nav_graph
Recource type : Navigation

nav_graph.xml 편집


[Text]로 표현하면 네비게이션 태그 처음 봐!
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android">

</navigation>
디자인에서 편집합니다.
이미지를 클릭합니다

"blank distination 만들기"를 누르십시오.

Fragment 이름, xml layout 생성, callback 생성...etc

이번에 LoginFragment, HomeFragment, ProfileFragment, SettingFragment를 제작했습니다.

탐색 전환 흐름을 추가합니다.
로그인 화면

홈 화면 → 프로필 화면

화면 설정
에서 설명한 대로 해당 매개변수의 값을 수정합니다.
iOS의 Storyboard와 가까워서 기분이 좋습니다.

이렇게 과도 절차가 완성된다!

Main Activity


여기서 프레임은 NavHostFragment를 지정합니다.
nav_graph.xml에 정의된 정보는 Bind인 것 같아요!
activity_main.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=".MainActivity">

    <fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph"/>

</android.support.constraint.ConstraintLayout>
MacinActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onSupportNavigateUp()
            = findNavController(this, R.id.my_nav_host_fragment).navigateUp()
}

Fragment


클릭 처리 중 다음 이동 목표 설정
Navigation.findNavController(view).navigate(R.id.action_loginFragment_to_homeFragment)
나머지 프레임도 똑같이 설치하면 된다.
fragment_login.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000"
    tools:context=".LoginFragment">

    <Button
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="login"/>

</FrameLayout>
LoginFragment.kt
class LoginFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        var view = inflater.inflate(R.layout.fragment_login, container, false)
        var button = view.findViewById<Button>(R.id.login_button);
        button.setOnClickListener { view ->
            Navigation.findNavController(view).navigate(R.id.action_loginFragment_to_homeFragment)
        }
        return view
    }
}

참조 URL

좋은 웹페이지 즐겨찾기