Ema*_*ele 26 android android-fragments back-stack
我目前正在构建一个Android应用程序(14 <= SDK <= 21),使用一个ActionBarActivity或多个Fragments,例如ListFragment和MapFragment,它们在一个FrameLayout视图中交换.
ActionBarActivity自动替换/提交片段A.然后,当用户点击一个按钮时,托管活动替换/提交一个新的不同片段B.我的目标是让用户在按下后退按钮时返回片段A .
现在有些代码了.
主要活动
public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener,
StopItemFragment.OnFragmentInteractionListener {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getFragmentManager();
fragmentManager.enableDebugLogging(true);
...
if (fragmentManager.findFragmentById(R.id.content_frame) == null) {
StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment
fragmentManager.beginTransaction()
.replace(R.id.content_frame, list)
.addToBackStack(null)
.commit();
}
...
@Override
public void onFragmentInteraction(String id) {
selectItem(Integer.parseInt(id));
}
private void selectItem(int position) {
StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment
...
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
...
}
}
Run Code Online (Sandbox Code Playgroud)
问题
即使addToBackStack()被调用,当我在片段B上时,我也无法返回片段A. MainActivity直接关闭.然而,我试图自己管理背堆,没有运气.我可以看到片段在堆栈上,但如果我调用popBackStackImmediate(),则弹出片段A并且不执行片段事务.(先回来什么都没发生,第二次活动关闭)
我还附加了FragmentManager logcat:http:
//pastebin.com/hFLHprL8
Nic*_*cks 71
对于那些仍在寻找解决方案的人.
在主Activity类(托管片段)中只需覆盖onBackPressed().
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0 ){
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
onBackPressed()片段中没有方法,这个方法只适用于activity.因此,当我们按后退键时,会显示默认行为activity,即
您将转到上一个活动(如果有)或应用程序将退出.
现在我们需要覆盖这个方法来告诉activity我们当我们按下后退键时,如果后面的堆栈中有任何碎片,则将它们弹出(这就是addToBackStack()进入图片时).否则请遵循默认行为.
试试这个(注意为fragmentA 添加不替换,为fragmentB 添加addToBackStack())
StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment
fragmentManager.beginTransaction()
.add(R.id.content_frame, list)
.commit();
Run Code Online (Sandbox Code Playgroud)
和
StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment
...
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.addToBackStack("FragmentB")
.commit();
Run Code Online (Sandbox Code Playgroud)
我不得不打电话beginTransaction()和commit()的FragmentManager手动.
通过覆盖解决onBackPressed():
@Override
public void onBackPressed() {
...
if (fragmentManager.getBackStackEntryCount() > 1){
fragmentManager.popBackStackImmediate();
fragmentManager.beginTransaction().commit();
} else {
//handle finish
finish(); // Closes app
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49757 次 |
| 最近记录: |