[android] Android에서 다른 조각으로 이동 한 후 탐색 스택을 지우는 방법
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)
.
답변
귀하의 질문은 특히 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.popBackStack(R.id.fragment_apps, true);
navController.navigate(R.id.fragment_company);
첫 번째 줄은 내 경우에 지정된 조각에 도달 할 때까지 백 스택을 제거하므로 홈 조각이므로 모든 백 스택을 완전히 제거하고 사용자가 fragment_company에서 다시 클릭하면 앱을 닫습니다.
답변
참고 : 작업 지우기는 더 이상 사용되지 않으며 공식 설명은
이 메소드는 더 이상 사용되지 않습니다. 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());
}
}
});
답변
여기에 내가 그것을 수행하는 방법이 있습니다.
//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)
답변
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();
//for clear current fragment from stack
NavOptions options = new
NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build();
navController.navigate(action, options);
}