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

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

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

当它作为一个独立的项目而不使用 activity group 时,它工作得很好,当控件进入 getview ()时,在 log cat 中一切都工作得很好,但是没有视图可见,甚至没有任何异常出现,我希望用章节细节片段替换书籍细节片段。

图书详细信息片段的 XML 具有 id book _ description _ part,而部分描述片段的 Xml 具有 id section _ description _ part。

上面的代码是在一个项目的 onClick 方法,我希望当用户点击一个项目在水平滚动视图,然后片段改变。

329038 次浏览

请看这个 提问

你只能替换一个“ 动态添加的片段”。

因此,如果您想添加一个动态片段,请参见 这个示例。

用 XML 硬编码的片段是无法替换的。如果需要用另一个片段替换一个片段,首先应该动态地添加它们。

注意: 碎片容器是将片段带到的活动中您所选择的布局或容器。

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

我已经提出了一个与 完美的方法管理 碎片 替代品生命周期的要点。

它只是用一个新的片段替换当前的片段,如果它不是相同的,如果它不在回栈中(在这种情况下,它将弹出它)。

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

= > 我是 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();

希望你做得很好。当我开始与 Android Fragments的工作,然后我也有同样的问题,然后我读到 如何切换片段与其他。 如何添加片段,如果 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();
}
}

享受你的代码时间:)

用视频寻呼机,这是我的工作。

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

您可以使用简单的代码来处理它的工作

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

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

您可以使用此代码

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

我在单行代码 中动态更改片段
它适用于任何 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();
}

如果您试图从另一个片段中更改该片段,那么这将会起作用。

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

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

可以使用片段 -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)
}

要用另一个片段替换一个片段,请注意 R.id.document 来自 XML 中给片段的第一个标记的 id。

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