用活动组内的另一个片段替换一个片段


137

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

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()时,每件事在log cat中工作都很好,但是没有视图可见,甚至没有任何异常出现,我希望将书详细信息片段由部分详细信息片段代替。

图书详细信息片段的XML具有id book_description_fragment,而节描述片段的xml具有id section_description_fragment。

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

Answers:


250

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

8
在这种情况下,R.id.fragment_container是什么?
盖伊2014年

4
@Guy,可以是您希望将片段加载到的任何布局。
Subin Sebastian 2014年

1
xml文件中的片段名称应该是什么?我想动态添加片段,并且不需要任何静态片段。
Rajat Mehra 2015年

1
@RajatMehra如果要动态添加片段,则根本不必在XML内部指定片段。您可以使用容器视图。请再次阅读答案。
Subin Sebastian 2015年

4
@Ahmed原因在于,根据体系结构,系统将每个<fragment>标记替换为相应片段提供的视图(组)onCreateView()。因此,您可以假设,对该片段的任何引用实际上在视图级别都会丢失。因此,您基本上不能替换片段,而是可以手动删除容器中现在存在的视图,然后在需要时将片段放在那里。
Subin Sebastian 2015年

35

请看这个问题

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

所以,如果你想添加一个动态的片段,看到这个例子。


1
你好 我已经找到了解决方案,实际上我没有将片段的内容放置在布局中,而是使用另一个片段作为先前片段的内容
Lion Heart

不,在这里我想用新片段替换整个片段。
萨那

1
@Lion Heart,能否请您详细说明找到的解决方案?
Namratha 2013年

链接已死:/
霓虹灯Warge'Nu

8

我已经掌握了用于管理片段替换生命周期的完美方法

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

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

=> 在此处查看要点

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

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

    super.onBackPressed();
}

1
@RémiP链接按预期工作。您可以检查这一项,可能是更好的IMO github.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/...
雨果GRESSE

8

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

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

3

希望您一切顺利。当我开始工作时,Android Fragments我也遇到了同样的问题,然后我读到了1-如何与他人交换片段。2-如何添加片段Fragment container没有片段。

然后经过一些研发,我创建了一个函数,该函数到目前为止在许多项目中都对我有帮助,而我仍在使用此简单函数。

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

享受你的代码时间:)


3

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

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

0

在Kotlin中,您可以执行以下操作:

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

0

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

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

0

我在单行代码中动态更改片段
它可以在任何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();
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.