标签: fragment-backstack

Android Fragments - remove fragment from back stack if already exists

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)

android android-fragments fragment-backstack

4
推荐指数
1
解决办法
4681
查看次数

片段BackStack.片段即使在流行后也会重叠.

问题是正确管理后台堆栈,以便先前(或删除)前一个片段.问题在于它们的重叠......

程序结构如下:

  • 滑动菜单与每个区段3个片段:CatalogFragment,NewsFragment,BlogFragment;
  • 每个片段都是带有项目的listView(从JSON解析);
  • CatalogFragment的项目点击我需要更换这个CatalogFragmentLessonsFragment,这是名单也.

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)

android overlapping android-fragments fragment-backstack

3
推荐指数
1
解决办法
9275
查看次数

带有嵌套/子片段的Android Backstack

我对嵌套片段的堆栈方式有一个问题,并且非常感谢所提供的任何帮助.

我有片段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

3
推荐指数
1
解决办法
711
查看次数

具有或不具有addToBackStack()的FragmentTransaction :: replace()

具有添加片段和后续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()会怎样?

博士说:“这首先搜索当前添加到经理活动中的片段;如果未找到此类片段,则搜索当前堆栈上的所有片段。”

情况将是

  1. 添加frgmtA; 不调用添加到堆栈;UI状态在这里改变了;

(如果frgmtA不是由add()动态添加的,而是在布局文件中使用class =“ frgmtA”分隔的,该怎么办?)

  1. 用frgmtB替换(); addToStack();

  2. 用frgmtC替换(); addToStack();

那么如果stackTop是frgmtC,则希望按后退按钮以将第一个frgmtA带回其最后一个UI状态。

android android-fragments fragment-backstack

3
推荐指数
1
解决办法
7160
查看次数

如何在片段交易中添加标签?

FragmentActivity像这样向我添加一个:

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)

android android-fragments fragment-backstack

1
推荐指数
1
解决办法
2784
查看次数

弹出片段后,所有 Editexts 将替换为相同的值

我有一个奇怪的问题,我有 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)

android android-fragments fragment-backstack

1
推荐指数
1
解决办法
518
查看次数