[Android/Java] Jetpack Navigation 화면 전환과 Fragment 간의 데이터 전달

Android Studio 4.1.3(windows판)에서의 흐름이 됩니다

다음 기사의 프로젝트 기반에 대한 설명입니다.

Android Developer의 Jetpack Navigation 화면 전환과 Fragment 간의 데이터 전달에 대한 설명은 다음과 같습니다.



SafeArgs 추가



※ 현시점에서는 androidx.navigation:navigation-safe-args-gradle-plugin을 implementation에서는 동작하지 않는 것 같습니다
※ androidx.navigation 버전에 맞게 설정하십시오.

build.gradle(Project)
buildscript {
    dependencies {
        def nav_version = "2.3.4"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

build.gradle(Module)
apply plugin: "androidx.navigation.safeargs"

화면 전환 준비



+ 버튼을 눌러 여기에 NextFragment를 추가합니다.

MainFragment의 Actions + 버튼을 눌러 화면 전환을 추가합니다.

Destination에서 nextFragment를 지정하고 Add 버튼으로 추가

Action이 추가되었습니다.

MainFragment에 화면 전환 실행을 위한 버튼 및 버튼 이벤트 추가
버튼 이벤트 설정 방법에 대해 자세히 알고 싶다면 아래를 참조하십시오.
여기에서는 MainFragment에 onClickButton 메서드를 추가하고 Jetpack Databinding에서 버튼 이벤트를 연결합니다.

화면 천이 처리의 구현



MainFragment.java
public void onClickButton() {
    final View view = binding.getRoot();
    // MainFragmentDirectionsはsafeargsを有効にすることで自動生成されます
    NavDirections directions = MainFragmentDirections.actionMainFragmentToNextFragment();
    Navigation.findNavController(view).navigate(directions);
}

Fragment간에 데이터를 전달하는 경우



NextFragment의 Arguments의 + 버튼을 누릅니다.

여기에서는 Name:Text Type:String 이라고 합니다.

Action(Argument Default Values)의 default value 값을 설정합니다.
여기에서는 none을 설정 ※default value를 설정하지 않으면 Action 클래스가 자동 생성되지 않습니다


NextFragment에 전달할 값 (여기서는 "xxx")을 설정합니다.

MainFragment.java
public void onClickButton() {
    final View view = binding.getRoot();
    // MainFragmentDirections.ActionMainFragmentToNextFragment/setText()は自動生成されます
    MainFragmentDirections.ActionMainFragmentToNextFragment action = MainFragmentDirections.actionMainFragmentToNextFragment();
    action.setText("xxx");
    Navigation.findNavController(view).navigate(action);
}

값을 받습니다.
※ 여기에서는 설명을 간략화하고 있습니다만, 실제로는 Jetpack View/DataBinding을 사용해 값을 설정해 주세요

NextFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.next_fragment, container, false);
    // NextFragmentArgsは自動生成されます
    String text = NextFragmentArgs.fromBundle(getArguments()).getText();
    TextView tv = view.findViewById(R.id.textView);
    tv.setText(text);
    return view;
}

좋은 웹페이지 즐겨찾기