当您有一个包含2个片段的活动时,将片段添加到addToBackstack

时间:2015-01-26 15:37:15

标签: android

Android Studio 1.1.2

您好,

我有MainActivity,TitlesFragment和DetailsFragment。

我的MainActivity将显示TitlesFragment,当用户点击标题时,TitlesFragment将被DetailsFragment替换。这很好。但是,当我将DetailsFragment添加到addToBackStack时。当我单击后退按钮时,它将关闭应用程序,而不是显示TitlesFragment。

我在考虑我需要2个活动。一个用于TilesFragment,另一个用于DetailsFragment?目前我正试图通过一项活动来做到这一点吗?

目前这是MainActivity的代码片段(仅显示片段事务)

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");

        setContentView(R.layout.activity_main);

        /* Load ListFragment */
        FragmentManager fragmentManager = getFragmentManager();
        Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);

        /* If the fragment is null then we need to load this fragment */
        if(fragment == null) {
            fragment = TitlesFragment.newInstance(1234);
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            fragmentTransaction.add(R.id.fragment_container, fragment, "TitlesFragment");
            fragmentTransaction.commit();
        }
    }

    @Override
    public void onColorPlateSelected(long plateID) {
        Log.d(TAG, "onColorPlateSelected: " + plateID);
        /* Get the plate ID and pass it to the details fragment */

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        /* Replace the fragment with the new color plate */
        fragmentTransaction.replace(R.id.fragment_container, DetailsFragment.newInstance(plateID), "DetailsFragment");
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        fragmentTransaction.commit();
    }

我对activity_main的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

这里ActivityMain将替换framelayout中的片段。

我通过处理OnBackPressed事件处理程序看到了这一点。但我想知道如果没有它我能做到吗?

非常感谢任何建议,

2 个答案:

答案 0 :(得分:1)

尝试将相同的addToBackStack()方法添加到您添加到活动的第一个列表片段中。即。

fragment = TitlesFragment.newInstance(1234);
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            fragmentTransaction.add(R.id.fragment_container, fragment, "TitlesFragment");

            fragmentTransaction.addToBackStack(null);

            fragmentTransaction.commit();

然后应该阻止第二个片段在后栈中替换它。

答案 1 :(得分:1)

我设法解决了这个问题。我的主要活动的签名是:

public class MainActivity extends ActionBarActivity  {
   ..
}

我正在扩展MainActivity以继承ActionBarActivity。但是,当我将类签名更改为:

public class MainActivity extends Activity  {
    ..
 }

一切都按预期工作,我可以使用backButton从detailsFragment导航到titlesFragment。

不确定为什么会这样,也许在使用片段时,动作栏最好在片段本身而不是在主要活动中实现。

希望这可以帮助别人