VERY Basic actionbarsherlock tabs with fragments: FragmentTransaction is null in the onTabSelected() method

14,840

You should make your Activity extend from SherlockFragmentActivity instead of SherlockActivity the same way you would use FragmentActivity instead of Activity with support-v4 package

Please have a look at the Fragment sample here: https://github.com/JakeWharton/ActionBarSherlock/tree/master/actionbarsherlock-samples/fragments

Share:
14,840
wuliwong
Author by

wuliwong

You can find out about me at http://patrickjustinbradley.com. I currently work on various tech products an Atlanta-based real estate company. I've worked at a couple other startups in the past as well as Oracle. On my own, I created a music collecting/sharing website http://www.muusical.com and a place to find Swift language tutorials http://www.sososwift.com. In May 2010, I received a PhD in physics from Georgia Tech. My research was nonlinear, computational physics applied to problems in neuroscience. My specialties are Rails/React with some experience in Go and Python.

Updated on June 06, 2022

Comments

  • wuliwong
    wuliwong almost 2 years

    I'm implementing some code from an example (http://arvid-g.de/12/android-4-actionbar-with-tabs-example) and trying to convert it to work with ActionBarSherlock.

    Here is TabActivity.java:

    package com.pnet;
    
    import com.actionbarsherlock.app.ActionBar;
    import com.actionbarsherlock.app.ActionBar.Tab;
    import com.actionbarsherlock.app.SherlockActivity;
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentTransaction;
    import android.util.Log;
    import android.widget.Toast;
    
    public class TabActivity extends SherlockActivity {
    
        private static String TAG = "TabActivity";
        public static Context appContext;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.tab_activity);
    
           //ActionBar gets initiated
            ActionBar actionbar = getSupportActionBar();
          //Tell the ActionBar we want to use Tabs.
            actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
          //initiating both tabs and set text to it.
            ActionBar.Tab PlayerTab = actionbar.newTab().setText("Fragment A");
            ActionBar.Tab StationsTab = actionbar.newTab().setText("Fragment B");
    
         //create the two fragments we want to use for display content
            Fragment PlayerFragment = new AFragment();
            Fragment StationsFragment = new BFragment();
    
        //set the Tab listener. Now we can listen for clicks.
            PlayerTab.setTabListener(new MyTabsListener(PlayerFragment));
            StationsTab.setTabListener(new MyTabsListener(StationsFragment));
    
       //add the two tabs to the actionbar
            actionbar.addTab(PlayerTab);
            actionbar.addTab(StationsTab);
        }
    
        class MyTabsListener implements ActionBar.TabListener {
            public Fragment fragment;
    
            public MyTabsListener(Fragment fragment) {
            this.fragment = fragment;
            }
    
            @Override
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                // TODO Auto-generated method stub
                if (fragment == null) {
                    Log.v(TAG, "fragment is null");
                }
    
                if (ft == null) {
                    Log.v(TAG, "fragment TRANSACTION is null");
                }
    
                ft.replace(R.id.fragment_container, fragment);          
            }
    
            @Override
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
                // TODO Auto-generated method stub
                Toast.makeText(TabActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show();
    
            }
    
        }
    }
    

    Here is AFragment.java

    package com.pnet;
    
    import com.actionbarsherlock.app.SherlockFragment;
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class AFragment extends SherlockFragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.afragment, container, false);
        }
    
    }
    

    Here is BFragment.java

    package com.pnet;
    
    import com.actionbarsherlock.app.SherlockFragment;
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class BFragment extends SherlockFragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.bfragment, container, false);
        }
    
    }
    

    Here is tab_activity.xml:

    <LinearLayout android:layout_gravity="center" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:id="@+id/fragment_container" android:layout_height="match_parent" android:layout_width="match_parent">
    
     </LinearLayout>
    </LinearLayout>
    

    Here is afragment.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:gravity="center_vertical|center_horizontal"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/hello_world"/>
    
    
    </LinearLayout>
    

    Here is bfragment.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:gravity="center_vertical|center_horizontal"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/tab_navigation_content"/>
    
    
    </LinearLayout>
    

    When the activity loads it triggers the onTabSelected() method. I put a couple if statements checking objects for null which write to the log and it shows that the FragmentTransaction object is null. Anyone see where I'm going wrong? Thanks.