【问题标题】:How to manage multiple fragments inside single tab如何在单个选项卡中管理多个片段
【发布时间】:2013-07-25 09:10:15
【问题描述】:

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

现在我在onTabChanged() 方法中为第一个选项卡添加第一个片段。我从第一个选项卡的第一个片段中替换另一个片段。但是当我转到第二个选项卡然后再次重新打开第一个选项卡时,第一个选项卡的状态未保持并且第一个片段变得可见,而不是第一个选项卡的第二个片段。

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

有人知道吗?

【问题讨论】:

  • 你在使用浏览器吗?
  • 现在不行。但是如果它有用并且可以解决我的问题,我已经准备好使用它。请给我同样的提示。
  • 这是我的问题之一,代码也许可以帮助你。我使用适配器来管理 tabs+viewpager stackoverflow.com/questions/17815305/… 中的片段

标签: android tabs android-fragments actionbarsherlock


【解决方案1】:

如果您使用两个选项卡,则必须为每个选项卡分别维护两个片段,即 Tab1 的 FragmentA 和 tab2 的 FragmentB 和 FragmentA 的 xml,FragmentB 应该有 FrameLayout 用于 FragmentTransaction。

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>

FragmentB 的 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 执行事务。即从第一个选项卡中的第一个片段(片段A)中替换另一个片段。像下面的代码

在片段A中:

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) 中替换另一个片段。像下面的代码

在片段B中:

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

【讨论】:

    【解决方案2】:

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

    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);
    }
    
    }
    

    【讨论】:

    • ragmentManager.findFragmentById() 总是返回 null。可能是什么原因?
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多