programing

프로그래밍 방식으로 백스택의 이전 프래그먼트로 돌아갑니다.

mailnote 2023. 10. 3. 11:15
반응형

프로그래밍 방식으로 백스택의 이전 프래그먼트로 돌아갑니다.

프래그먼트가 프로그래밍 방식으로 추가된 활동이 있다고 가정해 보겠습니다.

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

코틀린 앤서

  1. 먼저 Fragment Manager를 호출합니다.
  2. 그런 다음 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

반응형