And*_*per 5 android back-button android-fragments
当我尝试从子片段移动到父片段时,我的应用程序退出(它不会崩溃)。这里 LandingActivity.java 是我调用片段 ChannelGrid.java 的主要活动,它调用片段 GridMain.java。当我按下后退按钮时片段 GridMain 应用程序中的移动设备退出而不是移动到 ChannelGrid.java。我已将 addToBackStack("tag") 添加到片段并尝试使用 onKey()..我也在不同的设备上测试了我的应用程序..我检查了其他解决方案有同样的问题并尝试过,但没有任何效果..
导航抽屉-LandingActivity.java-ChaanelGrid.java(Fragment)-GridMain.java(Fragment)
登陆活动.java
currentFragment = new ChaanelGrid();
currentFragment.setArguments(args);
frgManager = getFragmentManager();
frgManager.beginTransaction().add(R.id.content_frame, currentFragment).addToBackStack("tag")
.commit();
Run Code Online (Sandbox Code Playgroud)
ChaanelGrid.java
Fragment currentFragment = new GridMain();
FragmentManager frgManager;
frgManager = getFragmentManager();
frgManager.beginTransaction().add(R.id.content_frame, currentFragment).addToBackStack("GridMain")
.commit()
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我尝试在 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();
}
}
Run Code Online (Sandbox Code Playgroud)
并在 GridMain.java 中跟随
protected boolean onBackPressed() {
FragmentManager frgManager;
frgManager = getFragmentManager();
frgManager.popBackStack();
return true;
}
Run Code Online (Sandbox Code Playgroud)
使用日志我检查了正在调用 LandingActivity.java 的 onBackPressed() 但仍然是相同的输出..
这就是我通常处理后退按钮的方式:
// "State Machine" variables: to indicate which is the active Fragment.
private static boolean isHelpShown = false;
protected static boolean isInfoShown = false;
protected static boolean isMainShown = false;
private static boolean isViewShown = false;
// Used to switch between Fragments.
private static enum Fragments
{
MAIN,
VIEW,
HELP,
INFO
}
@Override
public final void onBackPressed()
{
if (isMainShown)
{
// We're in the MAIN Fragment.
finish();
}
else
{
// We're somewhere else, reload the MAIN Fragment.
showFragment(Fragments.MAIN);
}
}
private final void showFragment(final Fragments FragmentType)
{
isViewShown = false;
isHelpShown = false;
isInfoShown = false;
isMainShown = false;
final FragmentTransaction ft =
getSupportFragmentManager().beginTransaction();
/*
Replace whatever is in the fragment_container view with this
fragment, and add the transaction to the back stack so the user can
navigate back.
*/
switch(FragmentType)
{
case HELP:
{
ft.replace(R.id.frgMaster, new FRG_Help());
isHelpShown = true;
break;
}
case INFO:
{
ft.replace(R.id.frgMaster, new FRG_Info());
isInfoShown = true;
break;
}
case VIEW:
{
ft.replace(R.id.frgMaster, new FRG_View());
isViewShown = true;
break;
}
case MAIN:
{
ft.replace(R.id.frgMaster, new FRG_Main());
isMainShown = true;
break;
}
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// Finalize the transaction...
ft.commit();
getSupportFragmentManager().executePendingTransactions();
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,对于我的需求,我仅在我们位于主片段(我退出)或不在主片段(我返回主片段:再次按后退键并退出)时处理。
您可以在 onBackPressed 方法中添加更多检查,以检查您是否位于另一个 Fragment 中,并相应地加载另一个 Fragment。
| 归档时间: |
|
| 查看次数: |
6146 次 |
| 最近记录: |