2016-09-26 149 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? –