조각을 사용하여 백스택 지우기
저는 제 안드로이드 앱을 벌집으로 포팅했고 조각을 사용하기 위해 큰 리팩터를 했습니다.이전 버전에서는 홈 버튼을 누를 때 사용했습니다.ACTIVITY_CLEAR_TOP
백업 스택을 재설정하기 위해.
이제 제 앱은 여러 개의 조각이 있는 단일 활동이므로 홈 버튼을 누르면 그 안에 있는 조각 중 하나만 교체합니다.도 백스택을 수 방법은 입니까?startActivity
ACTIVITY_CLEAR_TOP
발깃?
요아힘의 대답, 다이앤 해크본의 대답:
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
결국 다음을 사용하게 되었습니다.
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
하지만 다음과 같은 것을 똑같이 사용할 수도 있었습니다.
((AppCompatActivity)getContext()).getSupportFragmentManager().popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
모든 상태가 지정된 상태로 팝업됩니다.그런 다음 조각을 원하는 것으로 바꿀 수 있습니다.
@Warpzit의 코멘트에 대한 답변을 만들고 다른 사람들이 쉽게 찾을 수 있도록 합니다.
사용:
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
모든 관련 당사자에게 경의를 표합니다. 단순한 방법으로 전체 조각 백스택을 삭제할 수 있는 사용자가 얼마나 되는지 알고 매우 놀랐습니다.
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Android 설명서에 따르면 (관련)name
인수 - 청구된 작업 제안서의 "내용").
null인 경우 최상위 상태만 팝됩니다.
이제 귀사의 특정 구현에 대한 지식이 부족하다는 것을 알고 있습니다(예: 특정 시점에 백스택에 있는 항목 수). 하지만 광범위한 기기 및 공급업체에서 명확하게 정의된 동작을 기대할 때는 승인된 답변에 모든 돈을 걸 것입니다.
(참고로, 이것과 함께 무언가)
FragmentManager fm = getFragmentManager(); // or 'getSupportFragmentManager();'
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
fm.popBackStack();
}
루프 없이 백스택 지우기
String name = getSupportFragmentManager().getBackStackEntryAt(0).getName();
getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE);
여기서 name은 addToBackStack() 매개 변수입니다.
getSupportFragmentManager().beginTransaction().
.replace(R.id.container, fragments.get(titleCode))
.addToBackStack(name)
루프를 사용하지 않고 쉽게 작동합니다.
FragmentManager fragmentManager = getSupportFragmentManager();
//this will clear the back stack and displays no animation on the screen
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
수락된 답변으로는 부족했습니다.다음을 사용해야 했습니다.
FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
fm.popBackStackImmediate();
}
안녕하세요~ 저는 https://gist.github.com/ikew0ng/8297033 에서 훨씬 더 나은 솔루션을 찾았습니다.
/**
* Remove all entries from the backStack of this fragmentManager.
*
* @param fragmentManager the fragmentManager to clear.
*/
private void clearBackStack(FragmentManager fragmentManager) {
if (fragmentManager.getBackStackEntryCount() > 0) {
FragmentManager.BackStackEntry entry = fragmentManager.getBackStackEntryAt(0);
fragmentManager.popBackStack(entry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
그냥 덧붙이고 싶었어요 :--
다음을 사용하여 백스택에서 팝업 표시
fragmentManager.popBackStack()
트랜잭션에서 조각을 제거하는 작업일 뿐이므로 화면에서 조각을 제거할 수 없습니다.따라서 이상적으로는 보이지 않을 수 있지만 두 개 또는 세 개의 조각이 서로 겹쳐져 있을 수 있으며, 뒤로 키를 누르면 UI가 어수선하고 쌓여 있는 것처럼 보일 수 있습니다.
간단한 예를 들어 보겠습니다.
fragmentmanager.replace()를 사용하여 Fragmentmnet B를 로드하는 fragment A가 있다고 가정하고, 그런 다음 이 트랜잭션을 저장하기 위해 ToBackStack을 추가합니다.그래서 흐름은 다음과 같습니다.
STEP 1 -> Fragment A -> Fragment B (Fragment B로 이동했지만, Fragment A는 보이지 않고 백그라운드에 있습니다.)
이제 fragmentB에서 몇 가지 작업을 수행하고 Save(저장) 버튼을 누릅니다. 저장 후 fragmentA로 돌아갑니다.
STEP 2-> FragmentB를 저장하고 FragmentA로 돌아갑니다.
3단계 ->그러므로 일반적인 실수는 것입니다.fragment B에서 fragment Manager.replace() fragment B를 fragment A로 하겠습니다.
그러나 실제로 일어나고 있는 일은 Fragment A를 다시 로드하여 Fragment B를 대체하는 것입니다. 이제 Fragment A가 두 개 있습니다(Step-1에서 하나, 이 STEP-3에서 하나).
조각 A의 두 인스턴스가 서로 겹쳐 쌓이고, 이는 보이지 않을 수 있지만 실제로 존재합니다.
따라서 위의 방법으로 백스택을 삭제하더라도 트랜잭션은 삭제되지만 실제 fragment는 삭제되지 않습니다.따라서 이러한 특정한 경우 저장 버튼을 누르면 fm.popBackStack() 또는 fm.popBackImediate()를 수행하여 fragmentA로 돌아가기만 하면 됩니다.
따라서 올바른 Step3-> fm.popBackStack()은 이미 메모리에 있는 fragmentA로 돌아갑니다.
이 근처의 코틀린 사람들을 위해:
repeat(supportFragmentManager.backStackEntryCount) {
supportFragmentManager.popBackStack()
}
설명서를 읽고 fragment id가 무엇인지 연구하면 단순히 스택 인덱스인 것처럼 보이기 때문에 다음과 같이 작동합니다.
fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);
0)0
맨, 는 스택의 맨 아래에 있으므로, 여기에 포함하여 팝업하면 스택이 지워집니다.
주의: 위의 내용이 제 프로그램에서 작동하지만, FragmentManager 문서에서 id가 스택 인덱스라는 것을 실제로 명시하지 않기 때문에 조금 망설여집니다.그럴 수도 있고, 모든 디버그 로그를 통해 알 수 있지만, 어떤 특별한 상황에서는 그렇지 않을 수도 있습니다.누가 이것을 어떻게든 확인할 수 있습니까?그렇다면 위의 방법이 가장 좋습니다.그렇지 않은 경우 다음과 같은 방법이 있습니다.
while(fragmentManager.getBackStackEntryCount() > 0) { fragmentManager.popBackStackImmediate(); }
이 방법을 사용하여 컨텍스트 & 프래그먼트 태그를 백테이크 조각 제거에 필요한 위치로 전달하면 됩니다.
사용.
clearFragmentByTag(context, FragmentName.class.getName());
public static void clearFragmentByTag(Context context, String tag) {
try {
FragmentManager fm = ((AppCompatActivity) context).getSupportFragmentManager();
for (int i = fm.getBackStackEntryCount() - 1; i >= 0; i--) {
String backEntry = fm.getBackStackEntryAt(i).getName();
if (backEntry.equals(tag)) {
break;
} else {
fm.popBackStack();
}
}
} catch (Exception e) {
System.out.print("!====Popbackstack error : " + e);
e.printStackTrace();
}
}
효과가 있습니다. 이것을 사용해 보십시오.
public void clearFragmentBackStack() {
FragmentManager fm = getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount() - 1; i++) {
fm.popBackStack();
}
}
이런 식으로 작동하게 되었습니다.
public void showHome() {
getHandler().post(new Runnable() {
@Override
public void run() {
final FragmentManager fm = getSupportFragmentManager();
while (fm.getBackStackEntryCount() > 0) {
fm.popBackStackImmediate();
}
}
});
}
private void clearBackStack(){
SupportFragmentManaer fm = getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
이 방법을 호출하는 것은 매우 깔끔할 것입니다.
- 루프가 필요하지 않습니다.
- 단편 애니메이션을 사용하는 경우 애니메이션이 너무 많이 표시되지 않습니다.하지만 루프를 사용하면 됩니다.
private boolean removeFragFromBackStack() {
try {
FragmentManager manager = getSupportFragmentManager();
List<Fragment> fragsList = manager.getFragments();
if (fragsList.size() == 0) {
return true;
}
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
언급URL : https://stackoverflow.com/questions/6186433/clear-back-stack-using-fragments
'programing' 카테고리의 다른 글
동일한 프로젝트에서 서로 다른 빌드에 대해 서로 다른 .dockerignore 파일을 지정하는 방법은 무엇입니까? (0) | 2023.07.30 |
---|---|
스프링 부트 R2DBC: org.mariadb.r2dbc.client.유휴 기간 후 클라이언트 Base 연결에 예기치 않은 오류가 발생했습니다. (0) | 2023.07.30 |
passport.js RESTful 인증 (0) | 2023.07.30 |
데이터 프레임의 각 열에 있는 비-NaN 항목 수 (0) | 2023.07.30 |
런타임에 HttpModules를 프로그래밍 방식으로 등록 (0) | 2023.07.30 |