Fragment를 제거하는 방법, 즉 finish ()와 동등한 방법은 무엇입니까? Cf Df의 래퍼입니다. 모든 활동을 통해 시작되는

호환성 라이브러리를 사용하여 조각을 사용하도록 앱을 변환하고 있습니다. 현재 나는 서로 연결되어있는 많은 활동 (ABCD)을 가지고 있습니다 .D에는 ‘OK’버튼이 있습니다 .’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();


답변

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

findNavController().popBackStack()

모든 FragmentTransaction을 뒤에 수행합니다.


답변

DialogFragment가 요구 사항을 충족하는지 확인하십시오. DialogFragment에는 dismiss () 메서드가 있습니다. 내 의견으로는 훨씬 더 깨끗합니다.