2016-09-26 26 views
0

バックスタックが空の場合にのみアプリケーションを終了します。戻るボタンを2回押して、何らかの状態でアプリを終了します

私のアプリの1つのセクションには、画像がクリックされると、フルスクリーンイメージを示す断片が開くギャラリーが含まれています。このフルスクリーンイメージで戻るボタンが押されると、私はギャラリーの断片に戻りたいと思います。私はフラグメントをバックスタックに追加することでこれを行いました。

しかし、アプリケーションの他の部分では、戻るボタンを押すと、「終了するにはもう一度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()を使用して確認してください。手伝ってくれますか? –

+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()も変更する必要があります。

はまた、あなたが何かの差分を試すことができます。このリンク Why FragmentManager's getBackStackEntryCount() return zero?

+0

それが動作するかどうか確認してみましょう –

+0

今はトーストメッセージを表示していません。アプリは最初の戻るボタンを押して閉じる –

+0

sry my bad ..私の答えを更新する – Nitesh

0

をreffer。アクティビティのonBackPressedメソッドにExitコードを追加し、トリガが発生したときはいつでもを追加します。Gallery FragmentがActiveであることを確認してください。 、そうであればExitコードを実行するelseフラグメントを変更する。

//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ですか? –