首页 文章

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

提问于
浏览
123

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

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方法中,我希望当用户点击水平滚动视图中的项目时,片段会发生变化 .

8 回答

  • 31

    Fragments that are hard coded in XML, cannot be replaced. 如果您需要将片段替换为另一片段,您应该首先动态添加它们 .

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

    // Create new fragment and transaction
    Fragment newFragment = new ExampleFragment();
    FragmentTransaction transaction = getFragmentManager().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

    请看这个Question

    您只能替换“ dynamically added fragment ” .

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

  • 4

    我已经用 THE perfect method 来管理 fragment replacementlifecycle .

    它只用一个新片段替换当前片段,如果它不相同并且它不在backstack中(在这种情况下它将弹出它) .

    它包含几个选项,就好像您希望将片段保存在backstack中一样 .

    => See Gist here

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

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

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

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

    希望你做得很好 . 当我开始使用 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();
        }
    }
    

    享受你的代码时间:)

  • 0

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

    你可以使用简单的代码来处理事务

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

相关问题