programing

fragment를 제거하는 방법, 즉 finish()와 동등한 fragment를 제거하는 방법?

powerit 2023. 8. 1. 20:50
반응형

fragment를 제거하는 방법, 즉 finish()와 동등한 fragment를 제거하는 방법?

호환성 라이브러리를 사용하여 조각을 사용하도록 앱을 변환하고 있습니다.현재 저는 여러 활동(ABC D)이 서로 연결되어 있으며, D에는 버튼 'OK'가 있으며, 이 버튼을 누르면 통화가 완료되고 이 버튼을 통해 거품이 발생합니다.onActivityResult()추가적으로 C와 B를 파괴하는 것.

나의 이전 허니콤 프래그먼트 버전의 경우 각 활동은 효과적으로 프래그먼트 Af Bf Cf Df의 래퍼입니다. 모든 활동은 다음을 통해 시작됩니다.startActivityForResult()그리고.onActivityResult()각각의 조각들 안에서 행복하게 부를 수 있습니다.getActivity().finish()

제 허니콤 버전에서 제가 겪고 있는 문제는 A라는 하나의 활동만 있고 Bf, Cf, Df 조각은 다음을 사용하여 로드된다는 것입니다.FragmentManager.

제가 이해하지 못하는 것은 fragment Df, Cf, Bf를 제거하기 위해 'OK'를 눌렀을 때 Df에서 무엇을 해야 하는지입니다.

조각이 스택에서 저절로 튀어나오도록 시도했지만 예외가 발생했습니다.onActivityResult()사용하여 단편을 로드하지 않았기 때문에 쓸모가 없습니다.startActivityForResult().

제가 이것에 대해 완전히 잘못된 생각을 하고 있는 건가요?트랜잭션 관리자를 사용하여 팝업을 수행하려면 상위 조각 또는 활동과 통신하는 일종의 수신기를 구현해야 합니까?

최선의 접근 방식은 아니지만 지원/호환성 라이브러리를 사용하는 것이 가장 효과적이라고 생각합니다.

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

또는

getActivity().getFragmentManager().beginTransaction().remove(this).commit();

그렇지않으면.

또한 백스택을 사용하여 팝업할 수 있습니다.그러나 fragment가 백스택에 없을 수도 있습니다(fragment 트랜잭션에 따라).또는 스택을 터뜨려 잘못된 스택을 제거할 수 있는 마지막 스택이 아닐 수도 있습니다.

아래의 접근 방식을 사용할 수 있습니다. 잘 작동합니다.

getActivity().getSupportFragmentManager().popBackStack();

제가 이해하지 못하는 것은 fragment Df, Cf, Bf를 제거하기 위해 'OK'를 눌렀을 때 Df에서 무엇을 해야 하는지입니다.

1단계: Df가 활동 자체 또는 활동에서 제공하는 인터페이스 인스턴스에서 메서드를 호출하여 "Yo! we got the OK click!"라고 D에게 말하도록 합니다.

2단계: D가 다음을 통해 파편을 제거하도록 합니다.FragmentManager.

호스팅 활동(D)은 활동에 포함된 다른 부분(다른 활동에 포함된 부분)을 파악하는 활동입니다.따라서 조각 혼합에 영향을 미칠 수 있는 조각 내 이벤트가 활동에 전파되어야 하며, 이는 적절한 오케스트레이션 이동을 수행합니다.

CommonsWare에서 말하는 것처럼 활동에서 Fragment 추가 및 제거를 처리할 때 청취자를 사용해야 합니다.다음은 예입니다.

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());
            }
        });
    }
}

활동/앱 호환 활동에서:

@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();

새 탐색 구성 요소를 사용하는 경우 다음과 같이 간단합니다.

findNavController().popBackStack()

뒤에 있는 모든 조각 트랜잭션을 수행합니다.

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);
    }

잘 됐어요, 재미있게 놀아요!

작성 시:

//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();

그런 다음 이벤트 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()

그리고 다른 편지들도..

다음으로 돌아가기FragmentA, 그냥 전화하기popBackStack(0, "A")예, 추가할 때 지정한 플래그를 사용하고 명령에서 동일한 플래그여야 합니다.addToBackStack() 또는 replace add.replace 명령어 add를 사용합니다.

천만에요 ;)

같은 프래그먼트 안에 있는 동안 프래요.

getActivity().onBackPressed();

코틀린 -

requireActivity().onBackPressed()
parentFragmentManager.apply {
    val f = this@MyFragment
    beginTransaction().hide(f).remove(f).commit()
}

왜 그냥:

Activity()를 가져옵니다.finish()를 가져옵니다.

언급URL : https://stackoverflow.com/questions/5901298/how-to-get-a-fragment-to-remove-itself-i-e-its-equivalent-of-finish

반응형