Assigning Fragments to tabs in the ActionBar with different orientations

前端 未结 6 2202
半阙折子戏
半阙折子戏 2020-12-23 18:23

I have 3 fragments and an activity. I want to enable tabs on the ActionBar and assign a Fragment to each of the 3 tabs. How do I hook that up cor

相关标签:
6条回答
  • 2020-12-23 18:59

    This worked great for me! I had this problem where the activities were overlapping everytime I changed the tabs:

            mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
            if (mFragment != null && !mFragment.isDetached()) {
                FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
                ft.detach(mFragment);
                ft.commit();
    

    Thanks again!

    0 讨论(0)
  • 2020-12-23 19:08

    It looks like my answer can be found here: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentTabs.html

    /*
     * Copyright (C) 2011 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package com.example.android.apis.app;
    
    import com.example.android.apis.R;
    
    
    import android.app.ActionBar;
    import android.app.ActionBar.Tab;
    import android.app.Activity;
    import android.app.Fragment;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.widget.Toast;
    
    /**
     * This demonstrates the use of action bar tabs and how they interact
     * with other action bar features.
     */
    public class FragmentTabs extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            final ActionBar bar = getActionBar();
            bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    
            bar.addTab(bar.newTab()
                    .setText("Simple")
                    .setTabListener(new TabListener<FragmentStack.CountingFragment>(
                            this, "simple", FragmentStack.CountingFragment.class)));
            bar.addTab(bar.newTab()
                    .setText("Contacts")
                    .setTabListener(new TabListener<LoaderCursor.CursorLoaderListFragment>(
                            this, "contacts", LoaderCursor.CursorLoaderListFragment.class)));
            bar.addTab(bar.newTab()
                    .setText("Apps")
                    .setTabListener(new TabListener<LoaderCustom.AppListFragment>(
                            this, "apps", LoaderCustom.AppListFragment.class)));
            bar.addTab(bar.newTab()
                    .setText("Throttle")
                    .setTabListener(new TabListener<LoaderThrottle.ThrottledLoaderListFragment>(
                            this, "throttle", LoaderThrottle.ThrottledLoaderListFragment.class)));
    
            if (savedInstanceState != null) {
                bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
            }
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
        }
    
        public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
            private final Activity mActivity;
            private final String mTag;
            private final Class<T> mClass;
            private final Bundle mArgs;
            private Fragment mFragment;
    
            public TabListener(Activity activity, String tag, Class<T> clz) {
                this(activity, tag, clz, null);
            }
    
            public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
                mActivity = activity;
                mTag = tag;
                mClass = clz;
                mArgs = args;
    
                // Check to see if we already have a fragment for this tab, probably
                // from a previously saved state.  If so, deactivate it, because our
                // initial state is that a tab isn't shown.
                mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
                if (mFragment != null && !mFragment.isDetached()) {
                    FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
                    ft.hide(mFragment);
                    ft.commit();
                }
            }
    
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                if (mFragment == null) {
                    mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
                    ft.add(android.R.id.content, mFragment, mTag);
                } else {
                    ft.show(mFragment);
                }
            }
    
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                if (mFragment != null) {
                    ft.hide(mFragment);
                }
            }
    
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
                Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-23 19:08
            @Override
            public void onTabSelected(ActionBar.Tab tab, android.support.v4.app.FragmentTransaction fragmentTransaction) {
                // Check if the fragment is already initialized
    
                if (mFragment == null) {
                    // If not, instantiate and add it to the activity
                   // Toast.makeText(getApplicationContext(),"TAb "+tab.getPosition(),Toast.LENGTH_LONG).show();
                    if(tab.getPosition() == 1) {
                       mFragment = new HolderFragment();
                        fragmentTransaction.add(android.R.id.content, mFragment, mTag);
                    }
                    else if(tab.getPosition() == 0)
                    {
                        mFragment = new FragmentKnowledge();
                        fragmentTransaction.add(android.R.id.c`enter code here`ontent, mFragment, mTag);
    
                    }
                    /*else
                    {
    
                         mFragment = Fragment.instantiate(mActivity, mClass.getName());
                        fragmentTransaction.add(android.R.id.content, mFragment, mTag);
                    }
    */
                } else {
                    // If it exists, simply attach it in order to show it
                    fragmentTransaction.attach(mFragment);
                }
            }
    
    0 讨论(0)
  • 2020-12-23 19:21

    Create a new Android Sample project, choose the Support4Demos sample. You will find the FragmentTabs sample there.

    0 讨论(0)
  • 2020-12-23 19:23

    The link provided by @Metallicraft is dead so here is some help for those who still stumbles upon this post. Go here for help with implementing tabs.

    To see/read the original sample you can go to following folder if you've installed android development environment: android-sdk\samples\android-14\ApiDemos\src\com\example\android\apis\app\FragmentTabs.java

    Also if you have problem with fragments overlapping after orientation change its properly related to savedinstancestate passed on. Here is a copy paste from a google tutorial that explains the fragment overlapping issue and how to avoid it:

    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    
    public class MainActivity extends FragmentActivity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.news_articles);
    
            // Check that the activity is using the layout version with
            // the fragment_container FrameLayout
            if (findViewById(R.id.fragment_container) != null) {
    
                // However, if we're being restored from a previous state,
                // then we don't need to do anything and should return or else
                // we could end up with overlapping fragments.
                if (savedInstanceState != null) {
                    return;
                }
    
                // Create an instance of ExampleFragment
                HeadlinesFragment firstFragment = new HeadlinesFragment();
    
                // In case this activity was started with special instructions from an Intent,
                // pass the Intent's extras to the fragment as arguments
                firstFragment.setArguments(getIntent().getExtras());
    
                // Add the fragment to the 'fragment_container' FrameLayout
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.fragment_container, firstFragment).commit();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-23 19:25

    I had more or less the same problem, but the solutions presented above did not seem to work out in my situation. Eventually I found the following solution:

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            if (mFragment == null) {
                mFragment = Fragment.instantiate(mActivity, mClass.getName());
                ft.replace(android.R.id.content, mFragment, mTag); // Use replace iso add
            }
            else {
                ft.attach(mFragment);
            }
        }
    
    0 讨论(0)
提交回复
热议问题