繁体   English   中英

当您具有2个片段的单个活动时,将片段添加到addToBackstack

[英]Adding Fragment to the addToBackstack when you have a single activity with 2 fragments

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将替换帧布局中的片段。

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

非常感谢您的任何建议,

尝试仅将相同的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();

然后,这应防止第二个片段在后堆栈中替换它。

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

public class MainActivity extends ActionBarActivity  {
   ..
}

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

public class MainActivity extends Activity  {
    ..
 }

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

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

希望这可以帮助别人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM