如何在单个选项卡中管理多个片段

时间:2013-07-25 09:10:16

标签: android tabs android-fragments actionbarsherlock

我想在单个标签中使用多个片段。我的标签活动扩展了SherlockFragmentActivity

现在我在onTabChanged()方法中为第一个标签添加第一个片段。我从第一个标签中的第一个片段中替换另一个片段。但是当我转到第二个标签然后再次重新打开第一个标签时,没有维护第一个标签的状态,第一个标签变为可见而不是第一个标签的第二个片段。

我需要有关如何在单个选项卡中维护片段数量以及如何在单个选项卡中弹出退出片段前端的帮助。

任何人都有想法吗?

2 个答案:

答案 0 :(得分:1)

如果您使用两个选项卡,则必须为每个选项卡分别维护两个片段,即tabmentA for tab1和FragmentB for tab2和xmls of FragmentA,FragmentB应该有FrameLayout用于FrgmentTransaction。

FragmentA的xml,即frag_a.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragmentA_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >

</FrameLayout>

片段B的xml即frag_b.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragmentB_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >

</FrameLayout>

对于Tab1,始终使用R.id.fragmentA_container执行事务。即在第一个标签中替换第一个片段(FragmentA)中的另一个片段。如下面的代码

在FragmentA中:

Fragment fragment = new YourFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
getSupportFragmentManager().popBackStack();
fragment.setArguments(null);
ft.replace(R.id.fragmentA_container, fragment);
ft.commit();

对于Tab2,始终使用R.id.fragmentB_container执行事务。即在第二个标签中替换secondfragment(FragmentB)中的另一个片段。如下面的代码

在FragmentB中:

Fragment fragment = new YourFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
getSupportFragmentManager().popBackStack();
fragment.setArguments(null);
ft.replace(R.id.fragmentB_container, fragment);
ft.commit();

答案 1 :(得分:0)

以下是管理活动中多个片段的示例代码:

public class MainActivity extends FragmentActivity {

private FragmentManager fragmentManager;
Fragment currentFragment;
Fragment1 initialFragment;
Fragment2 nextFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    fragmentManager = getSupportFragmentManager();
    initialFragment = (Fragment1) fragmentManager.findFragmentById(R.id.initial_fragment);
    nextFragment = (Fragment2) fragmentManager.findFragmentById(R.id.next_fragment);
    nextFragment();
}

public void onNext(View v) {
    // User pressed next button on initial fragment
    showNextFragment();
}

private void showFragment(Fragment fragmentToShow) {
    Fragment[] fragments = { initialFragment, nextFragment /*... */ };
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    for(Fragment fragment : fragments) {
        if(fragment != fragmentToShow) {
            fragmentTransaction.hide(fragment);
        }
    }
    fragmentTransaction.show(fragmentToShow);
    fragmentTransaction.commit();
}

private void showInitialFragment() {
    currentFragment = initialFragment;
    showFragment(currentFragment);
}

private void showNextFragment() {
    currentFragment = nextFragment;
    showFragment(currentFragment);
}

}