在片段类

时间:2017-05-28 19:02:04

标签: java android android-fragments android-tabs

我正在处理一个应用程序,需要帮助在片段类中创建3个选项卡。

我正在按照其他主题中提出的教程进行操作,并且该教程在单独的项目中完美运行:

继承教程: https://maxalley.wordpress.com/2013/05/18/android-creating-a-tab-layout-with-fragmenttabhost-and-fragments/

但问题是:

在他使用的教程中

public class FragmentMain extends FragmentActivity {

但我有

public class FragmentCV extends Fragment {

我在我的主应用程序中使用"导航抽屉活动"当我点击导航抽屉上的符号时,我可以打开5个不同的片段。

现在,我想在其中一个片段中添加3个Tabs。

当我使用" FragmentActivity"就像在教程中一样,我从"导航抽屉活动"。

中得到一个错误
Error:(92, 82) error: incompatible types: FragmentCV cannot be converted to Fragment

当我将其更改回" Fragment"时,教程中的其余代码无效。

继承我的代码:

MainActivity.class

(这是导航抽屉活动的类,我只粘贴我打开其他碎片的代码)

public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_aboutme) {
            FragmentAboutme fragmentAboutme = new FragmentAboutme();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.relativelayout_for_fragment, fragmentAboutme).commit();

        } else if (id == R.id.nav_cv) {
            FragmentCV fragmentCV = new FragmentCV();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.relativelayout_for_fragment, fragmentCV).commit();

        } else if (id == R.id.nav_skills) {
            FragmentSkills fragmentSkills = new FragmentSkills();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.relativelayout_for_fragment, fragmentSkills).commit();

        } else if (id == R.id.nav_projects) {
            FragmentProjects fragmentProjects = new FragmentProjects();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.relativelayout_for_fragment, fragmentProjects).commit();

        } else if (id == R.id.nav_download) {
            FragmentDownloads fragmentDownloads = new FragmentDownloads();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.relativelayout_for_fragment, fragmentDownloads).commit();

        } else if (id == R.id.nav_website) {
            FragmentAboutme fragmentAboutme = new FragmentAboutme();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.relativelayout_for_fragment, fragmentAboutme).commit();

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

FragmentCV.class

(这是我用MainActivity.class打开的片段)

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;




public class FragmentCV extends FragmentActivity {
    private FragmentTabHost mTabHost;


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

        setContentView(R.layout.fragment_cv);
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);

        mTabHost.addTab(
                mTabHost.newTabSpec("Personal Profile").setIndicator("Profile", null),
                FragmentCVpage1.class, null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab2").setIndicator("Tab 2", null),
                Fragment_CVpage2.class, null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab3").setIndicator("Tab 3", null),
                FragmentCVpage3.class, null);
    }
}

FragmentCVPage1.java

(此片段应通过FragmentCV.class打开)

 import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;


    public class FragmentCVpage1 extends Fragment {


        public FragmentCVpage1() {
            // Required empty public constructor
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_cvpage1, container, false);
        }

    }

这个错误有没有简单的解决方案?

1 个答案:

答案 0 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabBackground="@android:color/white"
        app:tabGravity="fill"
        app:tabIndicatorColor="@android:color/black"
        app:tabIndicatorHeight="2dip"
        app:tabMaxWidth="0dp"
        app:tabMode="fixed"
        app:tabSelectedTextColor="@android:color/black"
        app:tabTextColor="#80000000" />

    <View
        android:layout_width="match_parent"
        android:layout_height="2dip"
        android:background="@drawable/ic_toolbar_shadow" />

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
  1. 创建上面的tab_layout.xml
  2. 创建名为TabHolder的以下类文件,该文件扩展了Fragment
  3. public class TabHolder扩展了Fragment {

    private static final int NUM_OF_TABS = 3;
    
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab_layout, container, false);
         final ViewPager viewPager = (ViewPager) view.findViewById(R.id.view_pager);
         final TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
    
          viewPager.setAdapter(new TabAdapter(getChildFragmentManager()));
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });
        return view;
    }
    
    private static class TabAdapter extends FragmentPagerAdapter {
        TabAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }
    
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new FragmentOne();
                case 1:
                    return new FragmentTwo();
                case 2:
                    return new FragmentThree();
    
            }
            return null;
        }
    
        @Override
        public int getCount() {
            return NUM_OF_TABS;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "TAB 1";
                case 1:
                    return "TAB 2";
                case 2:
                    return "TAB 3";
            }
            return null;
        }
    }
    

    }

    1. FragmentOne,FragmentTwo和FragmentThree是您创建的三个片段(我假设您已经想要在每个标签下显示)

    2. 确保您的活动扩展了AppCompatActivity而非活动

    3. 在您的xml中有一个FrameLayout的Activity中,只需加载TabHolder片段,它就会在各自的标签中显示三个片段。像这样加载TabHolder

    4. getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, new TabHolder).commit();