【发布时间】:2014-12-28 12:43:01
【问题描述】:
当我尝试从子片段移动到父片段时,我的应用程序退出(它不会崩溃)。这里 LandingActivity.java 是我调用片段 ChannelGrid.java 的主要活动,它调用片段 GridMain.java。当我在片段GridMain应用程序退出而不是移动到ChannelGrid.java中按下移动设备的后退按钮。我已将addToBackStack(“tag”)添加到片段并尝试使用onKey()..我也在不同设备上测试了我的应用程序..我检查了找出具有相同问题的其他解决方案并尝试了它们,但没有任何效果..
导航抽屉-LandingActivity.java-ChaanelGrid.java(Fragment)-GridMain.java(Fragment)
LandingActivity.java
currentFragment = new ChaanelGrid();
currentFragment.setArguments(args);
frgManager = getFragmentManager();
frgManager.beginTransaction().add(R.id.content_frame, currentFragment).addToBackStack("tag")
.commit();
ChaanelGrid.java
Fragment currentFragment = new GridMain();
FragmentManager frgManager;
frgManager = getFragmentManager();
frgManager.beginTransaction().add(R.id.content_frame, currentFragment).addToBackStack("GridMain")
.commit()
GridMain.java(我也试过不使用 onKey() 方法但没有用)
rootView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
Fragment currentFragment = new ChaanelGrid();
FragmentManager frgManager;
frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
.commit();
return true;
}
logcat 详细
10-31 21:46:57.954 24452-24452/D/ActivityThread﹕ ACT-AM_ON_PAUSE_CALLED ActivityRecord{41eb8b98 token=android.os.BinderProxy@41bb9828 {xyz/xyz..activity.LandingActivity_}}
10-31 21:46:57.971 24452-24452/ D/ActivityThread﹕ ACT-PAUSE_ACTIVITY_FINISHING handled : 0 / android.os.BinderProxy@41bb9828
10-31 21:46:58.007 24452-24452/ V/InputMethodManager﹕ focusOut: android.widget.GridView@41f06f40 mServedView=android.widget.GridView@41f06f40 winFocus=false
10-31 21:46:58.297 24452-24452/ I/SurfaceTextureClient﹕ [0x5143bc58] frames:44, duration:1.002000, fps:43.883736
10-31 21:46:58.350 24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.432 24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.753 24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.754 24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.755 24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 2)
10-31 21:46:58.879 24452-24452/ D/ActivityThread﹕ ACT-DESTROY_ACTIVITY handled : 1 / android.os.BinderProxy@41bb9828
我尝试在 LandingActivity.java 中添加以下内容
@Override
public void onBackPressed() {
FragmentManager frgManager;
frgManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag("GridMain");
if (fragment != null) {
GridMain gridMain = (GridMain) fragment;
if (!gridMain.onBackPressed()) {
super.onBackPressed();
}
}
else {
super.onBackPressed();
}
}
并在 GridMain.java 中跟随
protected boolean onBackPressed() {
FragmentManager frgManager;
frgManager = getFragmentManager();
frgManager.popBackStack();
return true;
}
使用日志我检查了 LandingActivity.java 的 onBackPressed() 是否被调用,但输出仍然相同..
【问题讨论】:
-
默认情况下(如果未处理),后退按钮会从主 Activity 退出。假设 LandingActivity 是您的主要 Activity 并且您在其中操作 Fragmen,您必须处理 Back 按钮按下以根据当前 Fragment 替换活动的 Fragment。
-
@Funkystein 我明白你所说的......请通过检查我尝试过的上述代码让我知道我哪里出错了。
-
@Funkystein 通过日志我检查了它是否在按下后退按钮时调用了 LandingActivity 的 onBackPressed() 方法,但应用程序正在退出..我放在 onBackPressed() 中的代码是否有任何问题LandingActivity的方法
-
查看我的回答,了解我通常的做法。
标签: android android-fragments back-button