Android Novice
Android Novice

Reputation: 546

Android Remove Fragments

How do you detach or remove FragmentTransaction? Can anyone show me an example on how to detach it. I've tried detach and remove. Its still not working. Please help me. Note that I'm using asynctask in my codes.

    @Override
        public void onActivityCreated(Bundle savedInstanceState) {

                new loadListView().execute();

            super.onActivityCreated(savedInstanceState);
        }

        public class loadListView extends AsyncTask<Integer, String, String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected String doInBackground(Integer... args) {
                ............
                }   


            @Override
            protected void onPostExecute(String args) {

                if (getActivity() != null) {
                adapter=new MainPageLazyAdapter(getActivity(), menuItems);
                setListAdapter(adapter);



             }
        }


        @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {



    FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(android.R.id.content, this);
        fragmentTransaction.attach(this);
        fragmentTransaction.commit();
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.detach(this);
        fragmentTransaction.commit();



    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }


}

LOGCAT :

10-09 14:49:42.305: E/AndroidRuntime(5731): FATAL EXCEPTION: main
10-09 14:49:42.305: E/AndroidRuntime(5731): java.lang.RuntimeException: Unable to start activity ComponentInfo{in.wptrafficanalyzer.actionbarsherlocknavtab/in.wptrafficanalyzer.actionbarsherlocknavtab.MainActivity}: java.lang.NullPointerException
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.os.Looper.loop(Looper.java:137)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.ActivityThread.main(ActivityThread.java:4512)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at java.lang.reflect.Method.invokeNative(Native Method)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at java.lang.reflect.Method.invoke(Method.java:511)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at dalvik.system.NativeStart.main(Native Method)
10-09 14:49:42.305: E/AndroidRuntime(5731): Caused by: java.lang.NullPointerException
10-09 14:49:42.305: E/AndroidRuntime(5731):     at in.wptrafficanalyzer.actionbarsherlocknavtab.AndroidFragment.onTabSelected(AndroidFragment.java:170)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at com.actionbarsherlock.internal.app.ActionBarWrapper$TabWrapper.onTabSelected(ActionBarWrapper.java:344)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:512)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:441)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:427)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at com.actionbarsherlock.internal.app.ActionBarWrapper.addTab(ActionBarWrapper.java:377)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at in.wptrafficanalyzer.actionbarsherlocknavtab.MainActivity.onCreate(MainActivity.java:24)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.Activity.performCreate(Activity.java:4465)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
10-09 14:49:42.305: E/AndroidRuntime(5731):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
10-09 14:49:42.305: E/AndroidRuntime(5731):     ... 11 more

Upvotes: 2

Views: 8224

Answers (2)

Mihira Prasanna
Mihira Prasanna

Reputation: 71

private void removeFragments()
{
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if (fragments != null) {
        android.support.v4.app.FragmentTransaction fragmentTransaction  = getSupportFragmentManager().beginTransaction();
        for (Fragment fragment : fragments) {
            if (fragment instanceof Fragment) {
                fragmentTransaction.remove(fragment);
            }
        }
        fragmentTransaction.commitAllowingStateLoss();
    }
}

Upvotes: 0

Romain Guidoux
Romain Guidoux

Reputation: 2951

This is wrong, see my update.

You need to call commit() on the FragmentTransaction after you add or remove fragments.

Example:

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(android.R.id.content, yourFragment);
fragmentTransaction.commit();

UPDATE

According to the doc, you have not to commit the transaction, the system does it for you: http://developer.android.com/guide/topics/ui/actionbar.html

Here is a minimalist example that works well. Your activity has to extend SherlockFragmentActivity (or FragmentActivity). The activity implements TabListener.

MainActivity:

public class MainActivity extends SherlockFragmentActivity implements TabListener
{
    private ActionBar.Tab homeTab;
    private ActionBar.Tab tagsTab;
    private FragOne fragOne;
    private FragTwo fragTwo;


    @Override
    public void onCreate(Bundle b)
    {
        super.onCreate(b);

        ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        homeTab = bar.newTab().setText("Home");
        tagsTab = bar.newTab().setText("Tags");

        homeTab.setTabListener(this);
        tagsTab.setTabListener(this);

        fragOne = FragOne.getInstance();
        fragTwo = FragTwo.getInstance();

        bar.addTab(homeTab);
        bar.addTab(tagsTab);
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (tab == homeTab)
            ft.replace(android.R.id.content, fragOne);
        else
            ft.replace(android.R.id.content, fragTwo);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {}

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {}
}

FragOne (the other fragment, FragTwo, has just a different layout):

public class FragOne extends SherlockFragment
{
    private static FragOne instance;


    public static FragOne getInstance()
    {
        if (instance == null)
            instance = new FragOne();
        return instance;
    }

    private FragOne() {}

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.frag_one_layout, container, false);
    }
}

Upvotes: 2

Related Questions