【发布时间】:2014-01-14 18:05:25
【问题描述】:
我有三个片段,分别是 GRANDPA、PA、ME。 有一个通用容器可以容纳这三个片段中的任何一个。
GRANDPA 中有一个按钮可以调用 PA。 同样,PA 中有一个按钮,它调用 ME。 在 ME 中有一个菜单项“DONEtoPA”,它返回到 PA。 同样,PA 中有一个菜单项“DONEtoGRANDPA”会返回给 GRANDPA。
除了一个很小的问题外,一切正常(所有导航)。
对于上述方案,用户可能存在三种情况:
情况 1:GRADPA 呼叫 PA 并且 PA 呼叫我...用户按 DONEtoPA 转到 PA,然后在 PA 中按 DONEtoGRANDPA 并转到 GRANDPA。 - 没有问题导航很好。
情况 2:GRADPA 呼叫 PA 并且 PA 呼叫我...用户按 BACK 键转到 PA,然后在 PA 中再次按 BACK 键并转到 GRANDPA。 - 没有问题导航很好。
问题情况 3:GRADPA 呼叫 PA,PA 呼叫我...用户按 DONEtoPA 转到 PA,然后在 PA 中按 BACK。在这里我必须按两次 BACK 按钮。在第一次返回时,第二次返回时没有任何反应,它会转到爷爷。
我不明白为什么需要两次后按。
我使用了片段的 addtobackstack()、hide() 和 show() 命令来导航,而不是 replace()。
代号:爷爷
//BUTTON CALLING PA
gp.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.hide(this);
ft.addToBackStack(getTag());
ft.add(R.id.LLfragmentconsole, new PA(), "PA");
ft.commit();
}
});
代码 PA:
//BUTTON CALLING PA
pa.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.hide(this);
ft.addToBackStack(getTag());
ft.add(R.id.LLfragmentconsole, new ME(), "ME");
ft.commit();
}
});
//MENU ITEM DONEtoGRANDPA
case R.id.mi_done:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(this);
ft.show(getActivity().getSupportFragmentManager().findFragmentByTag("GRANDPA"));
ft.commit();
return true;
给我编码:
//MENU ITEM DONEtoPA
case R.id.mi_done:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(this);
ft.show(getActivity().getSupportFragmentManager().findFragmentByTag("PA"));
ft.commit();
return true;
据我了解,当我按下 DONEtoPA 后堆栈记录时,仍会添加片段 ME。因此,当我在 PA 片段中按 BACK(第一次)时,它会尝试反转这一点,即删除片段 ME。但是由于我已经在我的 DONEtoPA 菜单项中完成了该操作,因此该单击基本上是浪费的。当我再次按下 BACK 时,backstack 记录更改为添加 PA 片段的记录,因此在 BACK 按下时反转它,即删除片段 PA。
简而言之,我想去掉这个双后按动作。
非常感谢您的帮助。
【问题讨论】: