将Fragment与FragmentActivity结合使用

时间:2013-12-06 14:44:11

标签: android android-activity fragment android-fragmentactivity

我对android中Fragments的使用不熟悉。 基本上我已经使用导航抽屉创建了一个幻灯片菜单。据我所知,所有菜单页面都是Fragment。如果我点击home,我会转到HomeFragment扩展Fragment类,它附加了它的片段布局。现在我想为主页实现选项卡布局。但要使用标签布局,我需要使用扩展FragmentActivity的片段。我如何结合这两件事因为它们不兼容!

我是否需要创建管理主片段的Activity?如果是,这是怎么做到的?

基本上我正在尝试将2个示例代码组合在一起。

  1. Slide menu with navigation draw

  2. Tab layout with slideview

  3. 所以我有一个班级

    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    
    public class HomeFragment extends Fragment {
    
        public Button btnLogout;
    
        // Session Manager Class
        public SessionManager session;
    
        public HomeFragment(){}
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            View rootView = inflater.inflate(R.layout.fragment_home, container, false);
    
            return rootView;
        }
    }
    

    和另一个班级

    import android.app.ActionBar;
    import android.app.ActionBar.Tab;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.view.ViewPager;
    
    import com.prjma.lovertech.R;
    import com.prjma.lovertech.adapter.TabsPagerAdapter;
    
    public class HomeActivity extends FragmentActivity implements
            ActionBar.TabListener {
    
        private ViewPager viewPager;
        private TabsPagerAdapter mAdapter;
        private ActionBar actionBar;
        // Tab titles
        private String[] tabs = { "Top Rated", "Games", "Movies" };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
    
            // Initilization
            viewPager = (ViewPager) findViewById(R.id.pager);
            actionBar = getActionBar();
            mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    
            viewPager.setAdapter(mAdapter);
            actionBar.setHomeButtonEnabled(false);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        
    
            // Adding Tabs
            for (String tab_name : tabs) {
                actionBar.addTab(actionBar.newTab().setText(tab_name)
                        .setTabListener(this));
            }
    
            /**
             * on swiping the viewpager make respective tab selected
             * */
            viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
                @Override
                public void onPageSelected(int position) {
                    // on changing the page
                    // make respected tab selected
                    actionBar.setSelectedNavigationItem(position);
                }
    
                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                }
    
                @Override
                public void onPageScrollStateChanged(int arg0) {
                }
            });
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }
    
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // on tab selected
            // show respected fragment view
            viewPager.setCurrentItem(tab.getPosition());
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        }
    
    }
    

    我基本上需要合并它们。怎么样?

2 个答案:

答案 0 :(得分:1)

只需使用viewpager

替换抽屉教程中的FrameLayout即可
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

然后在您的活动中将所有代码组合在一起

它看起来像这样

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- Framelayout to display Fragments -->
<android.support.v4.view.ViewPager 
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

<!-- Listview to display slider menu -->
<ListView
    android:id="@+id/list_slidermenu"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"       
    android:listSelector="@drawable/list_selector"
    android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>

答案 1 :(得分:0)

在您提供的第一个链接中,创作时使用FrameLayout作为其片段的主要内容(调用addreplace时,...)。

在第二个中,他创建了一个活动并通过指定actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);来启用操作栏

如果你想合并DrawerViewPager,这取决于你想做什么,你必须有可能:

  1. 如果您的应用主要内容是带有标签的寻呼机,那么您只需要根据Tyczj在评论中建议的ViewPager替换FrameLayout。

  2. 如果您希望带有标签的寻呼机位于片段中,请将HomeActivity更改为HomeMainFragment,以便处理ViewPager初始化,并在您的{ {1}}(您必须创建它)将调用MainActivity,调用片段管理器并使用setContentView(R.layout.activity_home)方法,如下所示:

    replace()
  3. 让我们为第二种方法添加一些代码。

    MainActivity fm.beginTransaction().replace(R.id.FRAME_LAYOUT_ID)

    onCreate()

    <强> HomeMainFragment

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
    
    // ...
    FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction ft = fragmentManager.beginTransaction();
            ft.replace(R.id.content_frame, fragment).commit();
    // ...
    
    }