2012-09-26 18 views
5

私は単一のFragmentActivityを持つ単純なフラグメントベースのアプリケーションを開発しています。アプリケーションの各「スクリーン」はフラグメントに含まれ、すべてのフラグメントはアプリケーションの起動時にコンテナレイアウトに追加されます。Android - バックボタンとフラグメントのバックスタックが機能しない

遷移は、現在表示されているフラグメントを隠してから、適切なフラグメントを表示することによって達成されます。

ft = fragMan.beginTransaction(); 
ft.show(mapFragment); 
ft.addToBackStack(null); 
ft.commit(); 

このすべてはうまく動作しますが、戻るボタンが押されたときに、関係なく、アプリケーションの終了は、その画面が表示されているか、以前のどのトランザクションがバックスタックに追加されました。

私は、バックスタックがレコードを適切に蓄積していることを確認し、フラグメントを隠したり表示したりするのではなく、フラグメントを置き換えるなど、さまざまなバリエーションのバリエーションを試しました。私の知る限りでは、私のコードは私が見つけることができるすべてのチュートリアルと例と一致しています。同様の問題の例や類似の問題を見つけることさえできませんでした。おそらく、その他。

マニフェストのプロパティ(かなり徹底的に調査した)などのアプリケーションレベルや、アプリケーションが正しく設定されているため、バックボタンが正常に機能しないなどの問題が発生する可能性があります。 。 onBackPressedをオーバーライドしてトランジションを手動で処理できますが、これは非常に醜い回避策のようです。なぜこれが期待どおりに動いていないのかについてのアイデアはありますか?ところで、これはJelly Beanを実行しているNexus 7にあります。

答えて

0

これが問題を解決するかどうかはわかりませんが、まずはすべてのフラグメントを追加する必要はないと思います。

私はまた、(少なくとも互換性ライブラリで)replaceメソッドが非常にバグがあるように見えることがあるので、まず既存のフラグメントを削除してから新しいものを追加することをお勧めします。ここで

は私がフラグメントを変更するために使用したコードのビットは次のとおりです。

/** 
* Changes the detail fragment of this activity. This is how all content is presented in this app. 
* @param fragment 
* @param animated 
* @param addCurrentFragmentToBackStack 
*/ 
private void changeDetailFragment(Fragment fragment,boolean animated,boolean addCurrentFragmentToBackStack) 
{ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

     if (animated) 
      transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 

    Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.detailFragment); 


    String fragName = "NONE"; 

    if (currentFrag!=null) 
     fragName = currentFrag.getClass().getSimpleName(); 


    if (currentFrag != null) 
    { 

     transaction.remove(currentFrag); 
    } 


    transaction.add(R.id.detailFragment,fragment); 


    if (addCurrentFragmentToBackStack) 
    { 
     Log.i("APP_NAME","Adding: " + fragName + " to the backstack"); 
     transaction.addToBackStack(null); 
    } 
    else 
    { 
     Log.i("APP_NAME","Not adding: " + fragName + " to the backstack"); 
    } 



    transaction.commit(); 

} 

は、この情報がお役に立てば幸いです。

2

アクティビティの代わりにサポートライブラリからFragmentActivityを使用しているかどうかを確認してください。これは、バックスタックとトランジションの問題を引き起こします。

関連する問題