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

时间:2011-04-14 04:46:35

标签: java android android-fragments

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

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

12 个答案:

答案 0 :(得分:241)

无法替换以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();

答案 1 :(得分:33)

请参阅此Question

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

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

答案 2 :(得分:8)

我已经用完美的方法来掌控片段 替换生命周期

它只会用新的片段替换当前片段,如果它不相同,并且它不在后台中(在这种情况下它会弹出它)。

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

=> See Gist here

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

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

    super.onBackPressed();
}

答案 3 :(得分: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 :(得分: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();

答案 5 :(得分:3)

希望你做得很好。当我开始使用Fragment container时,我也遇到了同样的问题然后我读到了 1-如何切换片段与其他。 2-如果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(); } } 没有任何片段,如何添加片段。

然后在一些R& D之后,我创建了一个函数,这个函数在很多项目中帮助我,直到现在我还在使用这个简单的函数。

and     ecx,0F0F0F0F           
              // masking zoned bits  -> 06 07 08 09
and     eax,0F0F0F0F              
            // masking zoned bits  -> 01 02 03 04
 add     ecx,eax         
            //  ecx value after addition 07 09 0B 0D (this is simple Binary add result,now need to convert it to BCD addition)

add     ecx,F6F6F6F6
            // after addition FE 00 02 03

mov     eax,ecx                  
             // eax = ecx = FE 00 02 03
and     eax,60606060
            // eax = 60 00 00 00
shr     eax,04 
            // eax = 06 00 00 00
and     ecx,0F0F0F0F
            // FE 00 02 03 & 0F 0F 0F 0F = 0E 00 02 03(ECX)
sub     ecx,eax 
            // 0E 00 02 03 - 06 00 00 00 = 08 00 02 03               // 8023 ans

享受您的代码时间:)

答案 6 :(得分: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);
    }
});

答案 7 :(得分:1)

您可以使用此代码

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<div class="form--group">
    <input class="thename" name="name[]" type="text" />
    <input type="text" class="date date_of_birth" name="date[]" />
</div>
<div class="form--group">
    <input class="thename" name="name[]" type="text" />
    <input type="text" class="date_of_birth" name="date[]" />
</div>
<a href="javascript:;" id="stepbirth" class="btn disabled">Next step</a>

<script>
function formIsInvalid() {
  var flag = false, name, date;
  $('.form--group').each(function() {
    if (flag) return;
    name = $(this).find('.thename').val();
    date = $(this).find('.date_of_birth').val();
    date = date !== undefined && date.length == 10;
    flag = !name || !date;
  });
  return flag
}

//Toggle disbaled class
$('.form--group').on('keyup','input', function() {
  $('#stepbirth').toggleClass('disabled', formIsInvalid());
});
</script>
</body>
</html>

或者您可以使用此代码

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

在科特林,您可以这样做:

Out

答案 10 :(得分: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();
    }

答案 11 :(得分:0)

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

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

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