合成Android片段backstack

时间:2015-01-30 14:07:22

标签: android android-fragments

我有一个使用片段来更改视图而不是启动新活动的活动。假设我有3个片段A,B和C.当应用程序启动时,默认片段设置为A.用户可以单击A上的按钮转换到B - 与B到C相同。

因此背斜包看起来像: [A] - > [B] - > [C]

我需要做的是直接从通知中直接链接到片段C,同时仍然构建backstack,以便在启动活动时。应显示片段C,同时允许用户单击后退按钮分别返回视图B和A.

3 个答案:

答案 0 :(得分:3)

您可以进行3次单独的交易。这比手动检查Backstack的状态要自然得多。

@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    showFragmentA();

    if (getIntent().hasExtra("some_deep_link_flag")) {
        showFragmentB();
        showFragmentC();
    }
}

private void showFragmentA() {
    Fragment a = new Fragment();

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, a)
            .addToBackStack(null)
            .commit();
}

private void showFragmentB() {
    Fragment b = new Fragment();

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, b)
            .addToBackStack(null)
            .commit();
}

private void showFragmentC() {
    Fragment c = new Fragment();

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, c)
            .addToBackStack(null)
            .commit();
}

答案 1 :(得分:0)

如果堆栈总是转到A - >; B - > C然后你可以覆盖活动中的onBackPressed()并弹出后面的堆栈并检查片段堆栈中的情况是什么。

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getFragmentByTag("C") != null) {
        if (getSupportFragmentManager().getBackStackEntryCount() == 2) {
            getSupportFragmentManager().beginTransaction.replace(...).commit();
        } else {
            getSupportFragmentManager().popBackStack();
        }
    } else if (getSupportFragmentManager().getFragmentByTag("B") != null) {
        if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
            getSupportFragmentManager().beginTransaction.replace(...).commit();
        } else {
            getSupportFragmentManager().popBackStack();
        }
    } else {
        //You are already on Fragment A
        super.onBackPressed();
    }
}

答案 2 :(得分:0)

像jmcdonnell40建议:

我的猜测是你应该在通知意图上多加一点,这表明你是从通知中输入你的活动。

然后,在活动的oncreate中,检查该额外的,如果它存在,只需执行2个必要的片段事务(片段A - > B - > C)并将它们添加到backstack。

无论如何,你将不得不手动打开你的最后一个片段。