【问题标题】:fragments overlap each other by pressing the back碎片通过按背面相互重叠
【发布时间】:2014-10-23 08:15:38
【问题描述】:

我有一个按钮和框架的活动:

public class MyActivity extends Activity implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button replaceBtn = (Button) findViewById(R.id.replaceFragment);
        replaceBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.replaceFragment:
                Fragment fragment1 = new Frag1();
                FragmentTransaction fTrans = getFragmentManager().beginTransaction();
                fTrans.replace(R.id.contentFrame, fragment1);
                **fTrans.addToBackStack(null);**
                fTrans.commit();
                break;
        }
    }
}

按钮被按下等。我创建了一个片段:

public class Frag1 extends Fragment  implements View.OnClickListener {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag1, null);
        Button replaceBtn2 = (Button) v.findViewById(R.id.replaceFragment2);
        replaceBtn2.setOnClickListener(this);
        return v;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.replaceFragment2:
                Frag2 fragment2 = new Frag2();
                FragmentTransaction fTrans = getFragmentManager().beginTransaction();
                fTrans.replace(R.id.contentFrame,fragment2);
                **fTrans.addToBackStack(null);**
                fTrans.commit();
                break;
        }
    }
}

它还有一个按钮,按下时我会创建 fragment2:

public class Frag2 extends Fragment implements View.OnClickListener {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag2, null);
        Button replaceBtn3 = (Button) v.findViewById(R.id.replaceFragment3);
        replaceBtn3.setOnClickListener(this);
        return v;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.replaceFragment3:
                Frag3 fragment3 = new Frag3();
                FragmentTransaction fTrans = getFragmentManager().beginTransaction();
                fTrans.replace(R.id.contentFrame,fragment3);
                **//do not add backstack**
                fTrans.commit();
                break;
        }
    }
}

fragment2 也创建了一个新的 fragment3:

public class Frag3 extends Fragment{
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag3, null);
        return v;
    }
}

然后当我按下屏幕上的“返回”按钮时,片段会以相反的顺序出现。但是我想当我在fragmente3时按下“返回”立即出现fragment1。

【问题讨论】:

    标签: android


    【解决方案1】:

    那是因为您没有将 fragment2 添加到 backstack。当从 backstack 中排除时,fragment 不会被弹回或消失。 backstack 的运行方式与 activity back stack 或任何其他堆栈容器的工作方式完全相同。

    为了更好地解释:

    将第一个片段添加到堆栈

    1. [stack] topElement Fragment1(正在显示)

    2. 已添加第二个但未添加到堆栈 [stack] topElement Fragment1(未显示)

    3. 将第 3 个片段添加到堆栈 [stack] topElement Fragment3(is 显示)

    现在,如果您弹出,它将按以下顺序返回:3rd,1st,仅此而已。

    编辑

    在这种情况下,您可以像这样简单地覆盖 onBackPressed() 来实现您想要的行为:

    onBackPressed(){

    //默认的后按行为 if(mFragmentManager.getBackStackEntryCount()==0)//如果想关闭可以设置==1 完成();

    mFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

    }

    【讨论】:

    • 我知道。我意识到问题了吗?我需要通过单击返回进入片段 3 来进入片段 1
    • 你能准确地说出你想得到什么订单吗?打开:1,2,3 关闭:3,2,1 ?
    • fragment1 - 入口点。在其中我可以创建 fragment2 并且在 fragmente2 中可以创建 fragment3 等等。但是当我单击后退按钮时,我必须退出 fragment1.open 1,2,3,4,5...n close 1
    • 你的意思是打开 1,2,3,4,5..n 关闭:只有第一个?或者您的意思是按您打开的确切顺序关闭?
    • 我加载了fragment1。从中我可以打开其他片段。可能有很多。以不同的顺序。但其他优惠之一。当我点击后退按钮时,我想总是得到fragment1。尽管在他之后发现了许多碎片。
    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多