2016-09-26 222 views
0

我只想退出应用程序只有当退栈是空的。按两次退出按钮退出应用程序

我的应用程序的一部分包含一个库,其中当点击一张图片时,会打开一个显示全屏图像的片段。当在这个全屏幕图像中按下后退按钮时,我想回到画廊片段。我通过添加片段返回堆栈来完成此操作。

但在应用程序的其他部分,当按下后退按钮时,我想显示一个祝酒词“请再次单击BACK退出”。当后退按钮再次按下时,应用程序关闭。我怎样才能做到这一点?

这是我迄今所做的:

boolean doubleBackToExitPressedOnce = false; 
@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0){ 
     getFragmentManager().popBackStack(); 
    } else { 

     if (doubleBackToExitPressedOnce) { 
      super.onBackPressed(); 
      return; 
     } 

     this.doubleBackToExitPressedOnce = true; 
     commonTasks.ShowStringMessage("Please click BACK again to exit"); 

     new Handler().postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       doubleBackToExitPressedOnce=false; 
      } 
     }, 2000); 

     //super.onBackPressed(); 
    } 
} 

显然没有奏效。

+0

请确认您是否使用getFragmentManager()或getSupportFragmentManager() – Nitesh

+0

@Nitesh:getFragmentManager()将片段添加到backstack。你能帮我吗? –

+0

你的代码对我来说很好看..你能告诉当你按下后退按钮时发生了什么吗? – Nitesh

回答

0

您可以尝试使用getSupportFragmentManager()

它有一个返回所有它包含,你可以把在检查其大小片段的阵列如下

boolean doubleBackToExitPressedOnce = false; 
@Override 
public void onBackPressed() { 
if (getSupportFragmentManager().getFragments().size() > 0){ 
    getSupportFragmentManager().popBackStack(); 
} else { 

    if (doubleBackToExitPressedOnce) { 
     super.onBackPressed(); 
     return; 
    } 

    this.doubleBackToExitPressedOnce = true; 
    commonTasks.ShowStringMessage("Please click BACK again to exit"); 

    new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      doubleBackToExitPressedOnce=false; 
     } 
    }, 2000); 

    //super.onBackPressed(); 
} 

}

的方法PS:你也需要改变getSupportFragmentManager()而片段横切。

而且reffer此链接 Why FragmentManager's getBackStackEntryCount() return zero?

+0

让我检查一下是否有效 –

+0

现在它甚至没有显示吐司消息。该应用程序关闭第一个后退按钮 –

+0

sry我的坏..更新我的答案 – Nitesh

0

你可以尝试一些差异。每当您获得onBackPressed触发器时,请在活动的onBackPressed方法中添加退出代码,并在处添加退出代码请检查您的Gallery Fragment是否处于活动状态? ,如果是则执行退出代码,否则更改片段。

//define as field variable 
private boolean doubleBackToExit = false; 

MyGalleryFragment myFragment = (MyGalleryFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT"); 
if (myFragment != null && myFragment.isVisible()) { 

    if (doubleBackToExit) { 
     super.onBackPressed(); 
     finishAffinity(); 
     return; 
    } 
    this.doubleBackToExit = true; 
    toastMsg(getResources().getString(R.string.touch_again_to_exit)); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      doubleBackToExit = false; 
     } 
    }, 2000); 
} else { 
    //Change Layout/Fragment 
} 

只是不忘记片段添加标签...

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT"); 

希望这将工作..!

+0

它不工作 –

+0

你添加了片段标签吗?并在活动中添加此代码? –

+0

是的,我做过。但我得到的错误: “MyGalleryFragment myFragment =(MyGalleryFragment)getFragmentManager()。findFragmentByTag(”MY_FRAGMENT“);”所以我做了这样的事情: “Fragment myFragment = getFragmentManager()。findFragmentByTag(”a“);” –

0

尝试使用

super.onBackPressed(); 

代替

getFragmentManager().popBackStack(); 

,并让我们知道结果。

+0

同样的结果。问题是控制总是进入else部分。即使在向后叠加添加一个片段之后。即,即使在(getFragmentManager()。getBackStackEntryCount()> 0)之后也是false。任何想法发生了什么? –

+0

你使用哪种类型的活动?它是AppCompatActivity还是FragmentActivity? –