0

タブの追加とそれらのタブへのリスナーの追加を担当する SherlockFragmentActivity があります。次の方法でタブを追加します。

public class HomeActivity extends SherlockFragmentActivity  {
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Theme_Styled);
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_home);
        // Set up the action bar.
        final ActionBar actionBar = getSupportActionBar();

        // Specify that we will be displaying tabs in the action bar.
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // First add some tabs and give them explaining names
        ActionBar.Tab homeTab = getSupportActionBar()
                               .newTab()
                               .setIcon(R.drawable.home_unselected)
                               .setTabListener(new TabListener<SherlockFragment>(this, "home", HomeFragment.class));

ActionBar.Tab profileTab = getSupportActionBar()
                               .newTab()
                               .setIcon(R.drawable.profile_unselected)
                               .setTabListener(new TabListener<SherlockFragment>(this, "profile", ProfileFragment.class));

    getSupportActionBar().addTab(homeTab);
    getSupportActionBar().addTab(profileTab);
}

    public static class TabListener<T extends SherlockFragment> implements ActionBar.TabListener
   {
      private SherlockFragment mFragment;
      private final SherlockFragmentActivity mActivity;
      private final String mTag;
      private final Class<?> mClass;

      /** Constructor used each time a new tab is created.
       * @param activity  The host Activity, used to instantiate the fragment
       * @param tag  The identifier tag for the fragment
       * @param clz  The fragment's Class, used to instantiate the fragment
       */
      public TabListener(Activity activity, String tag, Class<?> clz)
      {
         mActivity = (SherlockFragmentActivity) activity;
         mTag = tag;
         mClass = clz;
      }

    @Override
    public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab,
            android.support.v4.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub
         // Check if the fragment has already been initialised
         SherlockFragment  preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

         int resID = mActivity.getApplicationContext().getResources().getIdentifier(mTag + "_selected" , "drawable", mActivity.getPackageName());
         Drawable image = mActivity.getApplicationContext().getResources().getDrawable(resID);

         tab.setIcon(image);


         if (mFragment != null)
         {

            // If it exists, simply attach it in order to show it
            ft.attach(mFragment);

         }
         else if (preInitializedFragment != null)
         {
            mFragment = preInitializedFragment;
            ft.attach(mFragment);
         }
         else
         {
            // Not found, so instantiate and add it to the activity
            mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
         }
    }


    @Override
    public void onTabUnselected(
            com.actionbarsherlock.app.ActionBar.Tab tab,
            android.support.v4.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub
         if (mFragment != null) {
                // Detach the fragment, because another one is being attached
                ft.detach(mFragment);



                int resID = mActivity.getApplicationContext().getResources().getIdentifier(mTag + "_unselected" , "drawable", mActivity.getPackageName());
                 Drawable image = mActivity.getApplicationContext().getResources().getDrawable(resID);

                tab.setIcon(image);

         }
    }


    @Override
    public void onTabReselected(
            com.actionbarsherlock.app.ActionBar.Tab tab,
            android.support.v4.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

   }
}

タブごとに、タブが選択されている場合、そのタブのフラグメントがスタックにプッシュされるようにします。したがって、戻るボタンを押すと、アクティビティではなく前のフラグメントに戻ります。

したがって、私の推測では、次のように HomeActivity で onBackPressed を @Override することでした。

@Override
public void onBackPressed() {

    // initialize variables
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    // check to see if stack is empty
    if (fm.getBackStackEntryCount() > 0) {          
        fm.popBackStack();
        ft.commit();    
    }
    else {

        super.onBackPressed();
    }
    return;
}

しかし、fm.getBackStackEntryCount()ALWAYS の値は であることがわかりました0。したがって、フラグメントがスタックに追加されることはありません。なぜそうではないのですか?何が欠けていますか。

編集 :

まだ完全には解決されていませんが、次のコードがあります。

@Override
        public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab,
                android.support.v4.app.FragmentTransaction ft) {
            // TODO Auto-generated method stub
             // Check if the fragment has already been initialised
             SherlockFragment  preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

             int resID = mActivity.getApplicationContext().getResources().getIdentifier(mTag + "_selected" , "drawable", mActivity.getPackageName());
             Drawable image = mActivity.getApplicationContext().getResources().getDrawable(resID);

             tab.setIcon(image);

             FragmentTransaction transaction = mActivity.getSupportFragmentManager().beginTransaction();

             if (mFragment != null)
             {

                // If it exists, simply attach it in order to show it
                transaction.add(android.R.id.content, mFragment);
                transaction.addToBackStack(null);
                transaction.commit();

             }
             else if (preInitializedFragment != null)
             {
                mFragment = preInitializedFragment;
                transaction.attach(mFragment);
                transaction.addToBackStack(null);
                transaction.commit();
             }
             else
             {
                // Not found, so instantiate and add it to the activity
                mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
                transaction.add(android.R.id.content, mFragment);
                transaction.addToBackStack(null);
                transaction.commit();
             }
        }

しかし今、popBackStack()メソッドが起動されると、フラグメントの内容は空になります。また、タブのアイコンは、最後に選択したタブで選択されたままになります。

4

0 に答える 0