프래그먼트를 제거하는 방법, 즉 finish ()와 동등합니까?
호환성 라이브러리를 사용하여 조각을 사용하도록 앱을 변환하고 있습니다. 현재 나는 서로 연결되어있는 많은 활동 (ABCD)을 가지고 있으며, D에는 'OK'버튼이 있습니다.이 버튼을 누르면 호출이 끝나면 onActivityResult()
C와 B를 추가로 파괴합니다
나의 사전 Honycomb 프래그먼트 버전에서 각 활동은 효과적으로 프래그먼트 Af Bf Cf Df의 래퍼입니다. 모든 활동을 통해 시작되는 startActivityForResult()
및 onActivityResult()
조각의 각 행복하게 호출 할 수 있습니다 내getActivity().finish()
내가 겪고있는 문제는 내 Honeycomb 버전에서 하나의 활동 A 만 가지고 있으며 조각 Bf, Cf, Df는을 사용하여로드됩니다 FragmentManager
.
내가 이해하지 못하는 것은 조각 Df, Cf 및 Bf를 제거하기 위해 'OK'를 누를 때 Df에서 무엇을해야합니까?
조각 자체가 스택에서 튀어 나오려고했지만 예외가 발생했습니다. onActivityResult()
를 사용하여 조각을로드하지 않았기 때문에 쓸모가 없습니다 startActivityForResult()
.
나는 이것에 대해 완전히 잘못 생각하고 있습니까? 트랜잭션 관리자를 사용하여 팝을 수행하기 위해 부모 프래그먼트 또는 활동과 통신하는 일종의 리스너를 구현해야합니까?
내가 이해하지 못하는 것은 조각 Df, Cf 및 Bf를 제거하기 위해 'OK'를 누를 때 Df에서 무엇을해야합니까?
1 단계 : Df에게 D에게 "yo! OK 클릭을 받았습니다!" 액티비티 자체 또는 액티비티가 제공 한 인터페이스 인스턴스에서 메소드 호출을 통해.
2 단계 : D를 통해 조각을 제거하도록합니다 FragmentManager
.
호스팅 활동 (D)은 활동에 포함 된 다른 조각 (예 : 다른 활동에 있음)을 아는 것입니다. 따라서 프래그먼트 믹스에 영향을 줄 수있는 프래그먼트 내 이벤트가 활동으로 전파되어 적절한 오케스트레이션이 발생합니다.
그것이 가장 근접한 접근 방법은 아니지만 지원할 수있는 가장 적합한 방법은 지원 / 호환성 라이브러리입니다.
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
또는
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
그렇지 않으면.
또한 백 스택을 사용하여 팝할 수 있습니다. 그러나 프래그먼트가 백 스택에 없거나 (파편을 가져온 프래그먼트 트랜잭션에 따라 ..) 스택에 가져온 마지막이 아닐 수 있으므로 스택을 팝하면 잘못된 코드가 제거 될 수 있습니다.
아래 방법을 사용할 수 있습니다.
getActivity().getSupportFragmentManager().popBackStack();
CommonsWare가 말했듯이 활동이 프래그먼트 추가 및 제거를 처리하도록 리스너를 사용하도록해야합니다. 예를 들면 다음과 같습니다.
public class MyActivity extends FragmentActivity implements SuicidalFragmentListener {
// onCreate etc
@Override
public void onFragmentSuicide(String tag) {
// Check tag if you do this with more than one fragmen, then:
getSupportFragmentManager().popBackStack();
}
}
public interface SuicidalFragmentListener {
void onFragmentSuicide(String tag);
}
public class MyFragment extends Fragment {
// onCreateView etc
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
suicideListener = (SuicidalFragmentListener) activity;
} catch (ClassCastException e) {
throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Attach the close listener to whatever action on the fragment you want
addSuicideTouchListener();
}
private void addSuicideTouchListener() {
getView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
suicideListener.onFragmentSuicide(getTag());
}
});
}
}
Activity / AppCompatActivity에서 :
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
// if you want to handle DrawerLayout
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
if (getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
} else {
getFragmentManager().popBackStack();
}
}
}
그런 다음 조각을 호출하십시오.
getActivity().onBackPressed();
다른 답변에 언급 된 것처럼 조각에서 이것을 호출하십시오.
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
DialogFragment가 요구 사항을 충족하는지 확인하십시오. DialogFragment에는 dismiss () 메서드가 있습니다. 내 의견으로는 훨씬 더 깨끗합니다.
나는 그것을 위해 간단한 방법을 만듭니다.
popBackStack(getSupportFragmentManager());
내 ActivityUtils 클래스에 배치하는 것보다
public static void popBackStack(FragmentManager manager){
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
잘 작동하고 재미있게 보내십시오!
새 탐색 구성 요소를 사용하는 경우 다음과 같이 간단합니다.
findNavController().popBackStack()
모든 FragmentTransaction을 뒤에 수행합니다.
OnCreate :
//Add comment fragment
container = FindViewById<FrameLayout>(Resource.Id.frmAttachPicture);
mPictureFragment = new fmtAttachPicture();
var trans = SupportFragmentManager.BeginTransaction();
trans.Add(container.Id, mPictureFragment, "fmtPicture");
trans.Show(mPictureFragment); trans.Commit();
이것이 클릭 이벤트 1에서 조각을 숨기는 방법입니다.
//Close fragment
var trans = SupportFragmentManager.BeginTransaction();
trans.Hide(mPictureFragment);
trans.AddToBackStack(null);
trans.Commit();
그런 다음 int 이벤트 2를 다시 표시합니다.
var trans = SupportFragmentManager.BeginTransaction();
trans.Show(mPictureFragment); trans.Commit();
백 스택 히스토리의 네 번째 단편에서 첫 번째 단편으로 팝백해야하는 경우 태그를 사용하십시오 !!!
첫 번째 조각을 추가 할 때 다음과 같은 것을 사용해야합니다.
getFragmentManager.beginTransaction.addToBackStack("A").add(R.id.container, FragmentA).commit()
또는
getFragmentManager.beginTransaction.addToBackStack("A").replace(R.id.container, FragmentA).commit()
그리고 조각 B, C 및 D를 표시하려면 다음을 사용하십시오.
getFragmentManager.beginTransaction.addToBackStack("B").replace(R.id.container, FragmentB, "B").commit()
다른 편지들 ...
Fragment
A로 돌아가려면 popBackStack(0, "A")
yes를 호출 하고 추가 할 때 지정한 플래그를 addToBackStack()
사용하고 replace 또는 add 명령에 사용 된 플래그가 아니라 command에서 동일한 플래그 여야합니다 .
천만에요 ;)
같은 조각 안에있는 동안 조각을 닫으려면
getActivity().onBackPressed();
왜 그냥 :
getActivity (). finish ();
'IT story' 카테고리의 다른 글
Try 블록에 값을 반환하면 Final 문의 코드가 실행됩니까? (0) | 2020.04.19 |
---|---|
스위프트에서 지연을 만드는 방법? (0) | 2020.04.19 |
실제 메모리 사용량별로 정렬 된 최상위 프로세스를 보는 방법은 무엇입니까? (0) | 2020.04.19 |
Eclipse가 시작시 중단되는 것을 어떻게 방지합니까? (0) | 2020.04.19 |
호스트에서 Vagrant guest로 단일 파일을 복사하는 가장 쉬운 방법은 무엇입니까? (0) | 2020.04.19 |