【问题标题】:Switching fragments within tab在选项卡内切换片段
【发布时间】:2012-05-08 16:42:19
【问题描述】:

我正在创建一个使用 ActionBarSherlock 的应用。该应用程序由三个选项卡组成,在每个选项卡中,多个屏幕根据用户输入连续显示。我可以在选项卡之间切换片段,但是在 选项卡中切换片段会出现问题。我试过这样:

在主类中:

SingleStationFragment singleStationFragment = new SingleStationFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, singleStationFragment);
transaction.addToBackStack(null);
transaction.commit();

确实将第一个片段替换为第二个片段,但是当我更改选项卡时,第二个片段仍然可见,在旧选项卡的内容之上显示新选项卡的内容。我想我需要以某种方式分离onTabUnselected 中的第二个片段,但我不知道如何获得对这个片段的引用。

谁能帮我解决这个问题?

为了清楚起见,一些重要的类:

我的主要课程:

public class TreinVerkeer extends SherlockFragmentActivity {

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

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    private void setupTabs(Bundle savedInstanceState) {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        Tab tab = actionBar.newTab().setText("STATIONS").setTabListener(new TabListener<StationsFragment>(this, "stations", StationsFragment.class));
        actionBar.addTab(tab);

        tab = actionBar.newTab().setText("ROUTE").setTabListener(new TabListener<RouteFragment>(this, "route", RouteFragment.class));
        actionBar.addTab(tab);

        tab = actionBar.newTab().setText("DELAYS").setTabListener(new TabListener<DelaysFragment>(this, "delays", DelaysFragment.class));
        actionBar.addTab(tab);

        if (savedInstanceState != null) {
            actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex());
    }
}

TabListener(来自"Adding Navigations Tabs" on the Android developer site,有一些小的改动):

public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener {
    private SherlockFragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> 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<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
    SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

    // Check if the fragment is already initialized
    if (mFragment == null && preInitializedFragment == null) {
        // If not, instantiate and add it to the activity
        mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
        ft.add(android.R.id.content, mFragment, mTag);
    } else if (mFragment != null) {
        // If it exists, simply attach it in order to show it
        ft.attach(mFragment);
    } else if (preInitializedFragment != null) {
        ft.attach(preInitializedFragment);
        mFragment = preInitializedFragment;
    }
}

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // User selected the already selected tab. Usually do nothing.
    }
}

StationsFragmentRouteFragmentDelaysFragment是一样的,只是文字不同)

public class StationsFragment extends SherlockFragment {

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

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

【问题讨论】:

    标签: android tabs actionbarsherlock


    【解决方案1】:

    所以发生的事情是,在TabListener 中,在onTabUnselected 方法中,Fragment 没有分离,导致它仍然显示,同时显示新的Fragment

    造成这种情况的原因是,被分离的Fragment 是第一个片段,而不是我的第二个片段。我做了一些改变。

    Activity

    SingleStationFragment singleStationFragment = new SingleStationFragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(android.R.id.content, singleStationFragment, "STATIONS");
    transaction.addToBackStack(null);
    transaction.commit();
    

    这里我在replace() 方法中添加了"STATIONS" 标记,它与第一个片段的标记相同。
    TabListener 现在如下:

    public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener {
        private final SherlockFragmentActivity mActivity;
        private final String mTag;
        private final Class<T> mClass;
    
        private SherlockFragment mFragment;
    
        public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
        }
    
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
            if (preInitializedFragment == null) {
                mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
                ft.add(R.id.treinverkeer_fragmentcontent, mFragment, mTag);
            } else {
                ft.attach(preInitializedFragment);
            }
        }
    
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
    
            if (preInitializedFragment != null) {
                ft.detach(preInitializedFragment);
            } else if (mFragment != null) {
                ft.detach(mFragment);
            }
        }
    
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // User selected the already selected tab. Usually do nothing.
        }
    }
    

    onTabUnselected 方法中,我现在首先检索正确的Fragment,然后将其分离。

    希望这对某人有所帮助!

    【讨论】:

    • 能否请您给我一些代码,这正是我想要做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2022-08-16
    相关资源
    最近更新 更多