I have some fragments which will be replaced by following method. I think there's something wrong with my code because I want to prevent from adding multiple times a fragment into the back stack. If I click on fragment B twice, all instances will be added to the back stack and pressing back button will be passed through the two created instances.
public void replaceFragment(Fragment fragment, boolean addToBackStack, boolean customAnimation) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
String …Run Code Online (Sandbox Code Playgroud) 问题是正确管理后台堆栈,以便先前(或删除)前一个片段.问题在于它们的重叠......
程序结构如下:
CatalogFragment,NewsFragment,BlogFragment;CatalogFragment的项目点击我需要更换这个CatalogFragment用LessonsFragment,这是名单也.ps项目是俄语,但我认为你可以理解

这是添加(动态)这些片段的方式:
@Override
public void onNavigationDrawerItemSelected(int position) {
FragmentManager fragmentManager = getSupportFragmentManager();
// fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); //this also doesn't work
switch (position+1) {
case 1:
//getSupportFragmentManager().popBackStack(); // this doesnt work
fragmentManager.beginTransaction().replace(R.id.container,
CatalogFragment.newInstance(position + 1)).addToBackStack("catalog").commit();
break;
case 2:
fragmentManager.beginTransaction().replace(R.id.container,
NewsFragment.newInstance(position + 1)).addToBackStack("news").commit();
break;
case 3:
fragmentManager.beginTransaction().replace(R.id.container,
BlogFragment.newInstance(position + 1)).addToBackStack("blog").commit();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我如何用onCatalogFragmentInteraction接口中的方法替换片段中的新片段:
/** Methods for interaction with list items*/
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我对嵌套片段的堆栈方式有一个问题,并且非常感谢所提供的任何帮助.
我有片段A和片段B.片段A包含另一个片段(ButtonFragment).在活动的onCreate中,我加载片段A,而不是切换到片段B.当我回到片段A(从后台堆栈中)时,我得到以下错误.
异常调度完成信号.
E/MessageQueue-JNI(6330):MessageQueue回调中的异常:handleReceiveCallback
E/MessageQueue-JNI(6330):android.view.InflateException:二进制XML文件行#16:错误膨胀类片段
...
引起:java.lang.IllegalArgumentException:二进制XML文件行16:重复id 0x7f080000,标记null或父id 0x0与另一个片段com.example.fragmentnavigation.MainActivity $ ButtonFragment
没有子片段导航工作.也许我必须添加一些ChildFragmentManager处理,但我不知道在哪里和哪里.我希望你能帮助我.
MainLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.example.fragmentnavigation.MainActivity"
tools:ignore="MergeRootFrame" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
片段布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.fragmentnavigation.MainActivity$FragmentA" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<fragment
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.example.fragmentnavigation.MainActivity$ButtonFragment"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
MainAcitivity
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new …Run Code Online (Sandbox Code Playgroud) navigation android android-fragments android-nested-fragment fragment-backstack
具有添加片段和后续replace()片段的流程。所有片段都被动态添加,但并非所有call都被添加addToBackStack()。
getSupportFragmentManager().beginTransaction()
.add(R.id.frgment_holder, frgmtA, frgmtA.NAME)
.commit();
Run Code Online (Sandbox Code Playgroud)
在某个地方可以添加另一个,例如:
getSupportFragmentManager().beginTransaction()
.replace(R.id.frgment_holder, frgmtB)
.addToBackStack(frgmtB.NAME)
.commit();
Run Code Online (Sandbox Code Playgroud)
在replace()与frgmtB将从容器R.id.frgment_holder删除frgmtA。如果在此状态下按返回按钮,则会弹出frgmtB。但是,即使addToBackStack()添加时未调用它,它也会重新创建frgmtA 吗?
如果在通过序列将片段添加到同一容器的流程中,混合了add()和replace()调用,而有人调用addToBackStack()但有人不调用,则后退按钮的行为如何?
编辑:之后
getSupportFragmentManager().beginTransaction()
.replace(R.id.frgment_holder, frgmtB)
.addToBackStack(frgmtB.NAME)
.commit();
Run Code Online (Sandbox Code Playgroud)
将
getSupportFragmentManager().findFragmentByTag(frgmtA.NAME);
Run Code Online (Sandbox Code Playgroud)
仍然找到frgmtA?如果在添加frgmtA时也调用addToBackStack()会怎样?
博士说:“这首先搜索当前添加到经理活动中的片段;如果未找到此类片段,则搜索当前堆栈上的所有片段。”
情况将是
(如果frgmtA不是由add()动态添加的,而是在布局文件中使用class =“ frgmtA”分隔的,该怎么办?)
用frgmtB替换(); addToStack();
用frgmtC替换(); addToStack();
那么如果stackTop是frgmtC,则希望按后退按钮以将第一个frgmtA带回其最后一个UI状态。
Fragment我Activity像这样向我添加一个:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.frame_container, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(fragment.getClass().getName())
.commit();
Run Code Online (Sandbox Code Playgroud)
但是当我想找到Fragment使用时,FragmentManager它返回null:
Fragment oldFragment = (Fragment) getSupportFragmentManager().findFragmentByTag(fragment.getClass().getName());
Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的问题,我有 2 个片段,在第一个片段中,我有一些自定义EditText,还有一个按钮可以用第二个片段(addToBackStack= true)替换它,然后,在第二个片段中,我尝试使用popBackStack()返回到第一个片段,出现问题,所有自定义EditText都具有相同的值。
下面是我所有的代码
第一个片段
class FirstFragment : BaseFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btn_next.setOnClickListener {
val transaction = requireActivity().supportFragmentManager!!.beginTransaction()
.replace(R.id.contentFrame, SecondFragment(), "")
commitTransaction(transaction, true, -1)
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个片段
class SecondFragment : BaseFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_second, container, false)
}
override …Run Code Online (Sandbox Code Playgroud)