【问题标题】:Fragments are getting overlapped on back button片段在后退按钮上重叠
【发布时间】:2014-02-27 12:28:55
【问题描述】:

我创建了 3 个 Fragment,即(FragmentA、FragmentB、FragmentC)和一个 MainActivity。 每个片段中都有一个按钮,它将自己替换为下一个片段,直到 FragmentC。

我正在替换 FragmentA(用)FragmentB(然后用)FragmentC。

从 FragmentA 到 FragmentB 的交易使用以下函数

    @Override
    public void fragmentreplacewithbackstack(Fragment fragment, String tag) {

        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.contner,fragment , tag);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();   
//      fragmentManager.executePendingTransactions();

    }

从 FragmentB 到 FragmentC 的交易使用下面的函数

public void fragmentreplace(Fragment fragment,String tag){
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.contner,fragment , tag);
        fragmentTransaction.commit();   

    }

问题是当我从 FragmentC 按下返回按钮时,FragmentC 和 FragmentA 相互重叠。

【问题讨论】:

标签: android android-fragments overlap overlapping back-stack


【解决方案1】:

如果你想从这里在后按时转到 Fragment B,你还需要将 Fragment C 添加到 backstack。

所以也为片段 C 调用下面的代码。

 fragmentTransaction.addToBackStack(null);

编辑 - 将您当前使用的方法从 B 更改为 C,

public void fragmentreplace(Fragment fragment,String tag){
    FragmentManager fragmentManager=getSupportFragmentManager();
    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.contner,fragment , tag);
    fragmentTransaction.addToBackStack(null); //this will add it to back stack
    fragmentTransaction.commit();   
}

【讨论】:

  • 我不希望 FragmentB 在堆栈中。我希望我的交易使用 backpress 从 FragmentC 直接转到 FragmentA
  • 那么就不要将 Fragment B 添加到 back stack 中。将 C 添加到后台堆栈,这样当您按下返回时,它将从后台堆栈中删除,并且您将被带到 A,因为 B 现在不在图片中。
  • 如何将 fragmentC 添加到后台堆栈。
  • 查看我添加 C 的编辑,你必须删除 fragmentTransaction.addToBackStack(null);当你从 A 到 B 时。
  • 你删除线fragmentTransaction.addToBackStack(null);当你从 A 到 B 时?另外,请发布您现在正在尝试的代码。
【解决方案2】:

我也遇到了同样的问题,Budius 中的this answer 帮了我很多。

您可以通过以下方式解决您的问题:

1) 实例化以下监听器(您必须保持对 FragmentC 实例的引用),并且由于 fragmentA 是唯一添加到 backstack 的片段,当用户按下后退按钮时,backstack 中的事务数将为零

private OnBackStackChangedListener backStackChangedListener = new OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
        if(getSupportFragmentManager().getBackStackEntryCount()==0) {
            if(fragmentC!=null) {
                getSupportFragmentManager().beginTransaction().remove(fragmentC).commit();
            }
        }
    }
};

2) 在MainActivity启动时添加监听器

getSupportFragmentManager().addOnBackStackChangedListener(backStackChangedListener);

3) Activity 停止时移除监听器

【讨论】:

    【解决方案3】:

    您为什么不使用框架布局创建一个片段活动,您可以在其中用任何片段替换该框架..

    Screen extends FragmentActivity
    {
    protected void onCreate(Bundle b)
    {
        super.onCreate(b);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.work);
    
                callPerticularScreen(screenNumber,false,null,null);
         }
    public void callPerticularScreen(int screenNumber,boolean addToBackStack,String nameTag,Bundle b)
    {
        switch(screenNumber)
        {
        case registrationScreen:
            callFragForMiddleScreen(registrationPageFrag,addToBackStack,nameTag);
            break;
        case dashboardScreen:
            callFragForMiddleScreen(dashboardFrag,addToBackStack,nameTag);
            break;
            default:
                break;
        }
    }
    
    }
    

    现在,您可以从任何片段屏幕调用此函数,将您的片段替换为另一个..like..

    private void callFragForMiddleScreen(Fragment frag,boolean addToBackStack,String nameTag)
    {
        transFragMiddleScreen=getFragManager().beginTransaction();
        transFragMiddleScreen.replace(getMiddleFragId(),frag);
        if(addToBackStack)
        {
                transFragMiddleScreen.addToBackStack(nameTag);
        }
        transFragMiddleScreen.commit();
        //getFragManager().executePendingTransactions();
    }
    

    从你的片段中调用

    Frag1 extends Fragment
    {
    
    onActivityCreate()
    {
    middleScreen=(Screen) getActivity();
    
    middleScreen.callPerticularScreen(1,true,"tag");
    }
    }
    

    片段活动的布局..

    <RelativeLayout
        android:id="@+id/rl2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/rl" >
    
        <FrameLayout
            android:id="@+id/middle_screen"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </FrameLayout>
    </RelativeLayout>
    

    只是不要将片段 B 添加到后台堆栈,以便您可以直接来自 c-> a。

    【讨论】:

    • 我正在添加这样的内容,但片段 C 与片段 A 重叠
    • 在片段事务中使用替换而不是添加,片段不能重叠。
    • 当我按下返回按钮时,c 片段与片段重叠。
    • acoording to above code..add this -callPerticularScreen(screenNumber,false,null,null);-从 b-a 调用你的片段,然后按回。在这里,因此片段 b 没有添加到 backstack 中,因此 a 会出现
    【解决方案4】:

    25 个支持库

    例如,如果你有

    A -> B -> C
    A id is 0
    B id is 1
    C id is 2
    

    回滚到一个片段只需调用

    getFragmentManager().popBackStackImmediate(0 /* ID */, 0 /* flag */);
    

    0 - 是要回滚的 backstack 条目的 ID

    popBackStackImmediate(1, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    

    FragmentManager.POP_BACK_STACK_INCLUSIVE,这意味着您还想删除提供的 ID

    你也可以打电话

    getFragmentManager().popBackStackImmediate("stack_name", 0)
    

    "stack_name" 它是要恢复的 backstack 的名称

    例如

    A -> B -> C -> D
    A in MAIN_BACK_STACK
    B in MAIN_BACK_STACK
    C in SEPARATE_BACK_STACK
    D in SEPARATE_BACK_STACK
    

    如果你想恢复到片段 B 打个电话

    getFragmentManager().popBackStackImmediate("MAIN_BACK_STACK", 0)
    or
    getFragmentManager().popBackStackImmediate("SEPARATE_BACK_STACK", FragmentManager.POP_BACK_STACK_INCLUSIVE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      相关资源
      最近更新 更多