Nice programing

Android에서 다른 조각으로 이동 한 후 탐색 스택을 지우는 방법

nicepro 2020. 12. 29. 08:24
반응형

Android에서 다른 조각으로 이동 한 후 탐색 스택을 지우는 방법


나는 안드로이드에서 새로운 탐색 아키텍처 구성 요소사용 하고 있으며 새 조각으로 이동 한 후 탐색 스택을 지우는 데 어려움을 겪고 있습니다.

예 : 나는 loginFragment에 있고 홈 프래그먼트로 이동할 때 스택에서이 프래그먼트가 지워지도록하여 사용자가 뒤로 버튼을 눌렀을 때 loginFragment로 돌아 가지 않도록합니다.

탐색하려면 간단한 NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) 를 사용하고 있습니다.

현재 코드 :

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                    }
                }
            });

navigate () 에서 NavOptions사용해 보았지만 뒤로 버튼이 여전히 나를 loginFragment로 다시 보냅니다.

NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();   
             NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);

먼저 속성 app:popUpTo='your_nav_graph_id'app:popUpToInclusive="true"작업 태그를 추가합니다 .

<fragment
    android:id="@+id/signInFragment"
    android:name="com.glee.incog2.android.fragment.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_signInFragment_to_usersFragment"
        app:destination="@id/usersFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/main_nav_graph"
        app:popUpToInclusive="true" />
</fragment>

둘째, 위의 작업을 매개 변수로 사용하여 목적지로 이동합니다.

findNavController(fragment).navigate(
     SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

자세한 정보 문서 를 참조하십시오.

참고 : method를 사용하여 탐색 navigate(@IdRes int resId)하면 원하는 결과를 얻을 수 없습니다. 따라서 방법을 사용했습니다 navigate(@NonNull NavDirections directions).


참고 : 작업 지우기는 더 이상 사용되지 않으며 공식 설명은

이 메서드는 더 이상 사용되지 않습니다. NavController의 그래프 ID와 함께 setPopUpTo (int, boolean)를 사용하고 inclusive를 true로 설정하십시오.

이전 답변

당신은 코드의 모든 솜털을 통과 싶어하지 않는 경우, 당신은 단순히 확인할 수 있습니다 Clear Task에서 Launch Options작업의 속성이다.

시작 옵션

편집 : Android Studio 3.2 Beta 5부터 Clear Task가 더 이상 Launch Options 창에 표시되지 않지만 작업 태그에서 추가하여 탐색의 XML 코드에서 계속 사용할 수 있습니다.

app:clearTask="true"

새 탐색 아키텍처 구성 요소를 사용하여 일부 조각에 대해 탐색에서 UP을 비활성화하는 방법 덕분에 마침내 알아 냈습니다 .

NavOption으로 .setClearTask (true)를 지정해야했습니다.

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "signInWithCredential:success");


                        NavOptions.Builder navBuilder = new NavOptions.Builder();
                        NavOptions navOptions = navBuilder.setClearTask(true).build();
                        NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment,null,navOptions);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());

                    }

                }
            });

제 경우에는 새 조각을 열기 전에 백 스택의 모든 것을 제거해야했기 때문에이 코드를 사용했습니다.

navController.popBackStack(R.id.fragment_apps, true);
navController.navigate(R.id.fragment_company);

첫 번째 줄은 내 경우에 지정된 조각에 도달 할 때까지 백 스택을 제거하므로 홈 조각이므로 모든 백 스택을 완전히 제거하고 사용자가 fragment_company에서 다시 클릭하면 앱을 닫습니다.


귀하의 질문은 특히 Pop Behavior / Pop To / app : popUpTo (xml)를 사용하는 방법과 관련이 있다고 생각합니다.

설명서에서
탐색하기 전에 지정된 목적지로 팝업합니다. 이 대상을 찾을 때까지 백 스택에서 일치하지 않는 모든 대상을 팝합니다.

예제 (간단한 구직 앱)
start_screen_nav 그래프는 다음과 같습니다.

startScreenFragment (start) -> loginFragment -> EmployerMainFragment

                            -> loginFragment -> JobSeekerMainFragment

탐색 EmployerMainFragment하고 모든 것을 startScreenFragment하려면 코드는 다음과 같습니다.

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"
            app:popUpToInclusive="true" />

탐색 EmployerMainFragment하고 모두 제외 하고 싶다면 startScreenFragment코드는 다음과 같습니다.

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"/>

내가으로 이동하려면 EmployerMainFragment및 팝업 loginFragment하지 startScreenFragment 다음 코드는 다음과 같습니다

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/loginFragment"
            app:popUpToInclusive="true"/>

또는

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"/>

    NavController navController =Navigation.findNavController(requireActivity(),          
    R.id.nav_host_fragment);// initialize navcontroller

    if (navController.getCurrentDestination().getId() == 
     R.id.my_current_frag) //for avoid crash
  {
    NavDirections action = 
    DailyInfoSelectorFragmentDirections.actionGoToDestionationFragment();
    NavOptions options = new 
//for clear current fragment from stack
NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build();
    navController.navigate(action, options);
    }

여기에 내가 그것을 수행하는 방법이 있습니다.

 //here the R.id refer to the fragment one wants to pop back once pressed back from the newly  navigated fragment
 val navOption = NavOptions.Builder().setPopUpTo(R.id.startScorecardFragment, false).build()

//now how to navigate to new fragment
Navigation.findNavController(this, R.id.my_nav_host_fragment)
                    .navigate(R.id.instoredBestPractice, null, navOption)

다음과 같이 기본 활동의 뒤로 누름을 재정의 할 수 있습니다.

override fun onBackPressed() {

  val navigationController = nav_host_fragment.findNavController()
  if (navigationController.currentDestination?.id == R.id.firstFragment) {
    finish()
  } else if (navigationController.currentDestination?.id == R.id.secondFragment) {
    // do nothing
  } else {
    super.onBackPressed()
  }

}

참조 URL : https://stackoverflow.com/questions/50514758/how-to-clear-navigation-stack-after-navigating-to-another-fragment-in-android

반응형