프로그래밍 방식으로 백스택의 이전 프래그먼트로 돌아갑니다.
프래그먼트가 프로그래밍 방식으로 추가된 활동이 있다고 가정해 보겠습니다.
private void animateToFragment(Fragment newFragment, String tag) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
}
눈에 띄었던 이전의 조각으로 되돌아가는 가장 좋은 방법은 무엇입니까?
Android에서 버튼 클릭 시 트리거 백 버튼 기능을 찾았지만 백 키 이벤트를 시뮬레이션하는 것이 올바른 방법이 아니라고 생각합니다(또한 작동할 수 없습니다).
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
중인 finish()제가 관심이 없는 활동을 그냥 종료합니다.
이 문제를 해결할 더 좋은 방법이 있습니까?
요 좀 .getFragmentManager().popBackStack() 가지 중에서 할 수 s다)
http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()
제공되는 다른 답변에 대해 자세히 설명하자면, 다음은 제 솔루션(활동에 배치)입니다.
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("MainActivity", "popping backstack");
fm.popBackStack();
} else {
Log.i("MainActivity", "nothing on backstack, calling super");
super.onBackPressed();
}
}
우리가 프래그먼트를 업데이트/추가할 때,
해야 할 항목.addToBackStack().
getSupportFragmentManager().beginTransaction()
.add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
.addToBackStack(null)
.commit();
에 됩니다.getFragments.popBackStackImmediate()가하면 true합니다.
Android Navigation 아키텍처 구성 요소.
저는 다음 코드를 사용할 수 있습니다.
findNavController().popBackStack()
프래그먼트 트랜잭션에 addToBackStack()을 추가하지 않은 경우에는 이러한 답변이 작동하지 않지만 다음을 사용할 수 있습니다.
getActivity().onBackPressed();
당신의 어떤 파편이라도 한 발짝 뒤로 되돌아가기 위해;
해당 행을 onBackPressed() 메서드에 추가합니다.popBackStackImmediate() 메서드는 백스택에 조각이 있으면 이전 조각으로 돌아갑니다.
if(getFragmentManager().getBackStackEntryCount() > 0){
getFragmentManager().popBackStackImmediate();
}
else{
super.onBackPressed();
}
`
이 솔루션은 기본 프래그먼트에서 뒤로 눌렀을 때 앱을 닫으려고 할 때 하단 바 기반 프래그먼트 탐색에 완벽하게 작동합니다.
반면, 제 코드에서 "DetailedPizza"로 정의된 2차 프래그먼트(프래그먼트의 프래그먼트)를 열면 이전 상태의 1차 프래그먼트가 반환됩니다.건배!
백 프레스(back press)를 사용한 내부 활동은 다음과 같습니다.
Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");
if (home instanceof FragmentDetailedPizza && home.isVisible()) {
if (getFragmentManager().getBackStackEntryCount() != 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
} else {
//Primary fragment
moveTaskToBack(true);
}
그리고 다른 조각은 다음과 같이 발사합니다.
Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();
코틀린 앤서
- 먼저 Fragment Manager를 호출합니다.
- 그런 다음 BackPressed() 메서드에 사용합니다.
Kotlin과 함께 Android Studio 4.0에서 코딩하기:
fragmentManager?.popBackStack()
프로그래밍 방식으로 다음 코드를 사용하여 이전 프래그먼트로 돌아갑니다.
if ( getFragmentManager().getBackStackEntryCount() > 0)
{
getFragmentManager().popBackStack();
return;
}
super.onBackPressed();
이 조각을 다시 가져오려면 백스택에 이 조각을 추가하면 됩니다. 예:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment fragment = new LoginFragment();
//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack("SignupFragment");
ft.commit();
}
}
});
위의 경우, 저는 오픈합니다.LoginFragment언제Button button를 눌렀습니다. 지금 사용자가SignupFragment. 그래서 만약에addToBackStack(TAG)라고 불리는데, 여기서TAG = "SignupFragment", 뒤로 버튼을 누르면LoginFragment, 우리는 다시 돌아옵니다.SignUpFragment.
해피코딩!
추가하여fragment_tran.addToBackStack(null)마지막 조각에서, 마지막 조각으로 돌아올 수 있습니다.
새 조각 추가:
view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, new ChangePassword());
transaction.addToBackStack(null);
transaction.commit();
}
});
나에게 유용한 코틀린 코드를 따라가기
1. 여러 조각이 사용된 Simple Activity 클래스에 추가됨
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0) {
Log.i(TAG, "=============onBackPressed - Popping backstack====")
supportFragmentManager.popBackStack()
} else {
Log.i(TAG, "=============onBackPressed called because nothing on backstack====")
super.onBackPressed()
}
}
2. 여러 조각이 사용된 BottomNavigationView Activity 클래스에 추가됨
override fun onBackPressed() {
Log.e(TAG, "=============onBackPressed")
val navController = findNavController(R.id.nav_host_fragment)
when (navController.currentDestination!!.id) {
R.id.navigation_comments, R.id.navigation_my_posts -> {
menuItemPosition = 0
navController.navigate(R.id.navigation_home)
Log.i(TAG, "=============onBackPressed - Popping backstack with First fragment ====")
}
else -> {
Log.i(TAG, "=============onBackPressed called because nothing on backstack====")
super.onBackPressed()
}
}
}
저는 같은 아이디어를 찾아서 여기에 왔습니다. 그 사이에 저는 그것이 그렇게 나쁘지 않다고 생각하고 View Pager에서 작동합니다.
그래서 제가 한 일은 viewPager를 유지하는 상위 활동에서 onBackPressed 메서드를 재정의하고 첫 번째 조각에 도달할 때까지 항상 마이너스 1 위치로 돌아가도록 설정한 다음 활동을 닫습니다.
@Override
public void onBackPressed() {
if(viewPager.getCurrentItem()>0){
viewPager.setCurrentItem(viewPager.getCurrentItem()-1);
} else {
super.onBackPressed();
this.close();
}
}
private void close(){
this.finish();
}
이는 매번 한 방향씩만 되돌아가는 것과 같은 단점이 있을 수 있으므로 탭이 있고 fragments가 건너뛴 상태에서 위치를 전환하는 경우 잘 작동하지 않을 수 있습니다(0에서 2로 이동한 다음 다시 누르면 0이 아닌 1이 됩니다).
하지만 제 경우에는 탭이 없는 페이지에서 2개의 조각으로 작업을 잘 수행합니다.
getActivity().getSupportFragmentManager().popBackStackImmediate();
오어
getActivity().onBackPressed();
아래 코드를 사용해 보십시오.
@Override
public void onBackPressed() {
Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
if (myFragment != null && myFragment instanceof StepOneFragment) {
finish();
} else {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
}
언급URL : https://stackoverflow.com/questions/10863572/programmatically-go-back-to-the-previous-fragment-in-the-backstack
'programing' 카테고리의 다른 글
| 쉼표 연산자에서 왼쪽 피연산자는 부작용이 없으면 실제로 실행되지 않는 것이 보장됩니까? (0) | 2023.10.03 |
|---|---|
| 파이썬의 요소를 얻으려면 어떻게 해야 합니까?XML 파일에 인쇄할 트리? (0) | 2023.10.03 |
| 여러 파일에서 컨트롤러를 정의하는 방법 - AngularJs (0) | 2023.10.03 |
| 컴파일러 C가 브레인퍽에게 (교수를 괴롭힌다는 이유로) (0) | 2023.10.03 |
| 엘마도 예외를 처리합니까? (0) | 2023.10.03 |