Android - 一个选项卡中的多个片段

Posted

技术标签:

【中文标题】Android - 一个选项卡中的多个片段【英文标题】:Android - Multiple fragments in ONE tab 【发布时间】:2012-10-08 22:37:11 【问题描述】:

我在网上搜索了很多关于在一个操作栏选项卡中包含多个片段的可能性。

This question 最符合我的需求,但代码不起作用。

是否有另一种可能在一个选项卡中包含多个片段?


这是StartActivity

public class StartActivity extends FragmentActivity implements ActionBar.TabListener 

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);

        // Set up the action bar.
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        actionBar.addTab(
              actionBar.newTab()
             .setText("Karte")
              .setTabListener(new MapFragmentListener(this)));

    

对应的布局acticity_start 包含两个框架布局,用于将放置在选项卡中的两个片段。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >  

    <FrameLayout
        android:id="@+id/fragment_map"
        android:layout_
        android:layout_/>
    <FrameLayout
        android:id="@+id/fragment_realtime"
        android:layout_
        android:layout_/>

</LinearLayout>

TabListener 看起来像这样:

private class TabListener implements ActionBar.TabListener 

        private static final String fragment1_tag = "fragment1_tag";
        private static final String fragment2_tag = "fragment2_tag";

        private FragmentActivity activity;
        private RealtimeFragment fragment1;
        private RealtimeFragment fragment2;

        public TabListener(FragmentActivity activity) 

            this.activity = activity;

            android.support.v4.app.FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();

            fragment1 = (RealtimeFragment) activity.getSupportFragmentManager().findFragmentByTag(fragment1_tag);
            if (fragment1 != null && !fragment1.isDetached()) 
                ft.detach(fragment1);
            

            fragment2 = (RealtimeFragment) activity.getSupportFragmentManager().findFragmentByTag(fragment2_tag);
            if (fragment2 != null && !fragment2.isDetached()) 
                ft.detach(fragment2);
            

            ft.commit();
        

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) 
            // TODO Auto-generated method stub

        

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

            android.support.v4.app.FragmentTransaction fragmentTransaction = activity.getSupportFragmentManager().beginTransaction();

            if(fragment1 == null) 
                fragment1 = new RealtimeFragment();
                fragmentTransaction.add(R.id.fragment_map, fragment1, fragment1_tag);
             else 
                fragmentTransaction.attach(fragment1);
            


            if(fragment2 == null) 
                fragment2 = new RealtimeFragment();
                fragmentTransaction.add(R.id.fragment_realtime, fragment2, fragment2_tag);
             else 
                fragmentTransaction.attach(fragment2);
            


            fragmentTransaction.commit();

        

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

            android.support.v4.app.FragmentTransaction fragementTransaction = activity.getSupportFragmentManager().beginTransaction();

            if(fragment1_tag != null)
                fragementTransaction.detach(fragment1);
            if(fragment2 != null)
                fragementTransaction.detach(fragment2);


            fragementTransaction.commit();

        

    

RealtimeFragment 类和对应的布局fragment_realtime 如下所示:

public class RealtimeFragment extends Fragment 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
         View view = inflater.inflate(R.layout.fragment_realtime, container, false);
        return view;
    



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_
        android:layout_
        android:text="Button" />

</LinearLayout>

现在应该在一个标签中显示RealtimeFragment 类的两个片段。片段只显示一个按钮,但没有显示!为什么?

【问题讨论】:

为什么不发布一些代码和您遇到的错误? 【参考方案1】:

我正在寻找相同主题的解决方案,并找到了这个,它非常方便。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_
    android:layout_>
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_
            android:layout_ />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_
            android:layout_ />
</LinearLayout>

所以引用你的 Fragment 并膨胀它,就像普通的 Fragment 一样

【讨论】:

以上是关于Android - 一个选项卡中的多个片段的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个操作栏选项卡中维护多个Fragment堆栈或多个子片段

我在 viewpager 选项卡中的片段不刷新

Android:如何在选项卡内从一个片段导航到另一个片段? [关闭]

滚动选项卡中的片段时隐藏/显示工具栏

使用片段在选项卡中启动活动

如何在片段选项卡中添加另一个活动(例如视频活动)?