我无法理解碎片和BackStack

时间:2014-10-23 06:42:39

标签: android

我有一个按钮和框架:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="new fragment"
            android:id="@+id/replaceFragment" android:layout_gravity="center_horizontal"/>
    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="fill_parent" android:layout_gravity="center_horizontal" android:id="@+id/contentFrame">
    </FrameLayout>
</LinearLayout>

代码:

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

如果我在创建每个片段时都会添加一行:

fTrans.addToBackStack(null);

然后当我按下屏幕上的“后退”按钮时,会以相反的顺序出现片段。但我想当我在fragmente3当你按下“后退”时立即出现fragment1。 如果我不在fragment2中添加行fTrans.addToBackStack(null);,它们会重叠。

2 个答案:

答案 0 :(得分:0)

为了做到这一点,您可以在 fragments backStack 中保留 activity 引用,例如 {{1}您可以尝试以下内容:

onBackPressed

答案 1 :(得分:0)

这是一个我用于其中一个项目的函数。我在管理片段的Activity的父级中实现了它。我不知道我是否要澄清有关行为的任何内容,因为你在问题中告诉我们的一切对我都有意义。

我是我的情况,它是一个简单的应用程序(几乎是静态的),但它会改变碎片,并且,如你所愿,我想多次回到历史记录&#34;所以我认为这可能有所帮助。

@Override
   public void replaceFragment(FRAGMENT_TYPE destinyFragmentType, int fragmentContainerID, boolean addToBackStack) {
      FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
      Fragment currentFragment = FragmentFactory.getFragment(destinyFragmentType);
      fragmentTransaction.replace(fragmentContainerID, currentFragment);

      if (addToBackStack) {
        fragmentTransaction.addToBackStack(null);
      }

      fragmentTransaction.commit();
    }

注意:

  • 第二个参数是指示您是否需要的参数 保持历史与否。对于你的情况:frg1 - &gt; fr2:param true; FR2 - &GT; fr3:param false;
  • 我使用工厂以获得更清晰的代码,但您可以使用 无论你想要什么,改变标题,给你的片段功能 等

我希望这会有所帮助!!