我有一个使用片段来更改视图而不是启动新活动的活动。假设我有3个片段A,B和C.当应用程序启动时,默认片段设置为A.用户可以单击A上的按钮转换到B - 与B到C相同。
因此背斜包看起来像: [A] - > [B] - > [C]
我需要做的是直接从通知中直接链接到片段C,同时仍然构建backstack,以便在启动活动时。应显示片段C,同时允许用户单击后退按钮分别返回视图B和A.
答案 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。
无论如何,你将不得不手动打开你的最后一个片段。