143

我在组活动中有一个片段,我想用另一个片段替换它:

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

当它作为一个单独的项目完成而不使用活动组时,它工作正常,日志cat中的每件事都工作正常,因为控制进入getview(),但没有视图可见,甚至没有出现任何异常,我希望书籍详细信息片段被部分细节片段替换。

书籍详细信息片段的 XML 具有 id book_description_fragment 和章节描述片段的 xml 具有 id section_description_fragment。

上面的代码在一个项目的 onClick 方法中,我希望当用户在水平滚动视图中点击一个项目时,片段会发生变化。

4

14 回答 14

261

在 XML 中硬编码的片段不能被替换。如果您需要用另一个片段替换片段,首先应该动态添加它们。

注意:R.id.fragment_container是您在将片段带到的活动中选择的布局或容器。

// 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();
于 2013-09-22T06:13:06.903 回答
37

请看这个问题

您只能替换“动态添加的片段”。

因此,如果要添加动态片段,请参阅示例。

于 2011-06-05T00:19:29.570 回答
8

我总结了管理片段替换生命周期的完美方法

它只会用一个新片段替换当前片段,如果它不一样并且它不在后台堆栈中(在这种情况下它将弹出它)。

它包含几个选项,就好像您希望将片段保存在后台堆栈中一样。

=>在此处查看要点

使用此活动和单个活动,您可能希望将其添加到活动中:

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

    super.onBackPressed();
}
于 2016-03-02T11:12:54.857 回答
7

在 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();
于 2016-09-28T09:11:03.910 回答
4

使用 ViewPager。这对我有用。

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);
    }
});
于 2018-01-09T07:48:11.263 回答
4

使用 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();
于 2016-10-03T05:21:00.957 回答
2

希望你做得很好。当我开始工作时,Android Fragments我也遇到了同样的问题,然后我读到了 1-如何与其他片段切换。Fragment container2-如果没有任何片段,如何添加片段。

然后经过一些研发,我创建了一个可以帮助我到现在的许多项目的功能,我仍在使用这个简单的功能。

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

享受你的代码时间:)

于 2017-02-07T09:42:45.530 回答
1

您可以使用简单的代码进行交易

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 
于 2018-09-21T12:48:13.460 回答
1

我在单行代码中动态更改片段
它适用于任何 SDK 版本和 androidx
我使用导航作为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();
    }
于 2019-12-07T04:50:52.790 回答
1

您可以使用此代码

((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();
        }
于 2019-07-31T10:30:26.490 回答
0

您可以使用片段-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)
}
于 2021-09-25T04:35:18.747 回答
0

在科特林你可以这样做:

// 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()
于 2019-02-15T15:59:01.907 回答
0

如果您尝试从另一个片段更改片段,这将起作用。

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

注意如上述答案所述,您需要有动态片段。

于 2020-08-11T16:47:25.860 回答
0

要将片段替换为另一个片段,请注意 R.id.fragment 来自您为 XML 中片段的第一个标记提供的 id。

barAudioPlaying.setOnClickListener(view -> {
                getActivity().getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fragment,new HomeFragment())
                        .commit();
于 2022-02-26T21:39:19.953 回答