programing

fragment를 액티비티 그룹 내의 다른 fragment로 대체

newsource 2022. 9. 24. 12:39

fragment를 액티비티 그룹 내의 다른 fragment로 대체

그룹 액티비티 내에 fragment가 있어 다른 fragment로 대체하고 싶다.

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

액티비티 그룹을 사용하지 않고 별도의 프로젝트로 진행하면 문제없이 동작하고, getview 안에 컨트롤이 들어가 로그캣에서는 모든 것이 정상적으로 동작하지만, 뷰가 보이지 않고, 예외도 발생하지 않으므로, 도서 상세 부분을 섹션 상세 조각으로 대체해 주었으면 합니다.

도서상세 fragment의 xml은 id book_description_fragment이고 섹션 설명 fragment의 xml은 id section_description_fragment입니다.

위 코드는 아이템의 onClick 메서드로 사용자가 수평 스크롤 뷰에서 아이템을 탭하면 fragment가 변경되도록 합니다.

XML 로 하드 코드화된 fragment는 교환할 수 없습니다.fragment를 다른 fragment로 치환할 필요가 있는 경우는, 우선 동적으로 fragment를 추가할 필요가 있습니다.

주의: R.id.fragment_fragment는 fragment를 가져오는 액티비티에서 선택한 레이아웃 또는 컨테이너입니다.

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

질문을 참조해 주세요.

"동적으로 추가된 조각"만 바꿀 수 있습니다.

다이나믹 프래그먼트를 추가하는 경우는, 다음의 예를 참조해 주세요.

단편 교체와 라이프 사이클을 관리하기 위한 완벽한 방법을 제시했습니다.

현재 fragment를 새 fragment로 바꿀 뿐입니다.fragment가 동일하지 않고 backstack에 없는 경우(이 경우 pop됩니다).

fragment를 백스택에 저장하는 것과 같은 옵션이 몇 가지 포함되어 있습니다.

=> Gist는 이쪽

이 항목과 단일 활동을 사용하여 다음 항목을 활동에 추가할 수 있습니다.

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}

Android에서는 아래 코드를 사용합니다.support.v4

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();

v4를 사용하여 이 코드 사용

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();

View Pager를 사용합니다.나한텐 일인데.

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});

잘 지내시길 바랍니다.처음 일을 시작했을 때Android Fragments저도 같은 문제가 있었습니다.1 - fragment를 다른 fragment로 전환하는 방법2 - fragment를 추가하는 방법Fragment container에는 fragment가 없습니다.

그리고 R&D를 거쳐 지금까지 많은 프로젝트에 도움이 되는 기능을 만들었고 지금도 이 간단한 기능을 사용하고 있습니다.

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

코드 타임을 즐기다 :)

당신은 간단한 코드를 트랜잭션에 사용할 수 있습니다.

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 

이 코드를 사용할 수 있습니다.

((AppCompatActivity) getActivity()).getSupportFragmentManager().beginTransaction().replace(R.id.YourFrameLayout, new YourFragment()).commit();

또는 이 사용 코드를 사용할 수 있습니다.

YourFragment fragments=(YourFragment) getSupportFragmentManager().findFragmentById(R.id.FrameLayout);

        if (fragments==null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.FrameLayout, new Fragment_News()).commit();
        }

합니다.
및 Androidx SDK에서 할 수 .
은 ★★★★★★★★★★★★★★로 사용하고 있습니다.BottomNavigationView

    BottomNavigationView btn_nav;
    FragmentFirst fragmentFirst;
    FragmentSecond fragmentSecond;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        fragmentFirst = new FragmentFirst();
        fragmentSecond = new FragmentSecond ();
        changeFragment(fragmentFirst); // at first time load the fragmentFirst
        btn_nav = findViewById(R.id.bottomNav);
        btn_nav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch(menuItem.getItemId()){
                    case R.id.menu_first_frag:
                        changeFragment(fragmentFirst); // change fragmentFirst
                        break;
                    case R.id.menu_second_frag:
                        changeFragment(fragmentSecond); // change fragmentSecond
                        break;
                        default:
                            Toast.makeText(SearchActivity.this, "Click on wrong bottom SORRY!", Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });
    }
public void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout_changer, fragment).commit();
    }

코틀린에서는 다음 작업을 수행할 수 있습니다.

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()

이것은, 다른 fragment로부터 fragment를 변경하려고 하는 경우에 유효합니다.

Objects.requireNonNull(getActivity()).getSupportFragmentManager()
.beginTransaction()
.replace(R.id.home_fragment_container,new NewFragment())

위의 답변에서 설명한 바와 같이 동적 fragment가 필요합니다.

fragment-ktx 를 사용할 수 있습니다.

// If you are in fragmet
childFragmentManager.beginTransaction()

// or if you are in activiry
supportFragmentManager.beginTransaction()

// Create and commit a new transaction
supportFragmentManager.commit {
  setReorderingAllowed(true)
  // Replace whatever is in the fragment_container view with this fragment
  replace<ExampleFragment>(R.id.fragment_container)
}

fragment를 다른 fragment로 치환하려면 , XML 의 fragment의 첫 번째 태그에 지정한ID 로부터 「R.id.fragment」가 취득되는 것에 주의해 주세요.

barAudioPlaying.setOnClickListener(view -> {
                getActivity().getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fragment,new HomeFragment())
                        .commit();

언급URL : https://stackoverflow.com/questions/5658675/replacing-a-fragment-with-another-fragment-inside-activity-group