将 ActivityGroup 应用程序转换为使用 Fragments/FragmentGroup

Converting ActivityGroup app to use Fragments/FragmentGroup

我有一个应用程序,我迫切需要将其从使用旧的 ActivityGroup class 转换为 Fragments。我不确定如何去做。下面是我现在使用的代码示例。谁能提供一些关于我应该采取哪些步骤开始将其切换为使用 Fragments / FragmentManager 的见解?

Main.java

public class Main extends TabActivity implements OnTabChangeListener {

    public static TextView txtViewHeading;
    public static Button btnBack;
    public static ImageButton btnShare;
    public static Main mainActivity;
    public static Boolean isVisible = false;
    private GoogleCloudMessaging gcm;
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mainActivity = this;
        NotificationsManager.handleNotifications(this, NotificationSettings.SenderId, PushHandler.class);
        registerWithNotificationHubs();

        //reference headings text & button for access from child activities
        txtViewHeading = (TextView) findViewById(R.id.txtViewHeading);
        btnBack = (Button) findViewById(R.id.btnBack);
        btnShare = (ImageButton) findViewById(R.id.btnShare);

        // Update the font for the heading and back button
        Typeface arialTypeface = Typeface.createFromAsset(getApplicationContext().getAssets(), "fonts/arial.ttf");
        Typeface myriadTypeface = Typeface.createFromAsset(getApplicationContext().getAssets(), "fonts/myriad.ttf");
        txtViewHeading.setTypeface(myriadTypeface);
        btnBack.setTypeface(arialTypeface);

        Resources res = getResources();
        TabHost tabsNavigation = getTabHost();

        // Set up the views for each tab - custom view used for Badge icon
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // Set up my tabs...each one looks similar to this
        View statusTabView = inflater.inflate(R.layout.tab, null);
        ImageView statusTabIcon = (ImageView) statusTabView.findViewById(R.id.tabIcon);
        statusTabIcon.setImageResource(R.drawable.tab_first);
        TextView statusTabText = (TextView) statusTabView.findViewById(R.id.tabText);
        statusTabText.setText("Status");
        statusTabText.setTypeface(arialTypeface);
        statusTabBadge = (TextView) statusTabView.findViewById(R.id.tabBadge);
        statusTabBadge.setTypeface(arialTypeface);
        tabsNavigation.addTab(tabsNavigation.newTabSpec(getResources().getString(R.string.main_tab_status))
                .setIndicator(statusTabView)
                .setContent(new Intent(this, StatusGroupActivity.class)
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

        //Set default tab to Status
        tabsNavigation.setCurrentTab(0);
        tabsNavigation.setOnTabChangedListener(this);

    }


    /* Set txtViewHeading text to selected tab text */
    @Override
    public void onTabChanged(String tabId) {
        // TODO Auto-generated method stub
        txtViewHeading.setText(tabId);
    }

    /* Set code to execute when onDestroy method is called */
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }


    /* Set code to execute when onPause method is called */
    @Override
    protected void onPause() {
        super.onPause();
        isVisible = false;
    }

    /* Set code to execute when onResume method is called */
    @Override
    protected void onResume() {
        super.onResume();
        isVisible = true;
    }


    /* Set code to execute when onStop method is called */
    @Override
    protected void onStop() {
        super.onStop();
        isVisible = false;
    }

    /**
     * Check the device to make sure it has the Google Play Services APK. If
     * it doesn't, display a dialog that allows users to download the APK from
     * the Google Play Store or enable it in the device's system settings.
     */
    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                ToastNotify("This device is not supported by Google Play Services.");
                finish();
            }
            return false;
        }

        return true;
    }

    public void ToastNotify(final String notificationMessage) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(Main.this, notificationMessage, Toast.LENGTH_LONG).show();
            }
        });
    }

    public void registerWithNotificationHubs()
    {
        if (checkPlayServices()) {
            // Start IntentService to register this application with GCM.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }
    }

}

TabGroupActivity.java

public class TabGroupActivity extends ActivityGroup 
{
    private ArrayList<String> mIdList;
    Button btnBack;
    ImageButton btnShare;
    TextView txtViewHeading;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        btnBack = Main.btnBack;
        btnShare = Main.btnShare;
        txtViewHeading = Main.txtViewHeading;
        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        if (mIdList == null) mIdList = new ArrayList<String>();
    }
    /**
     * This is called when a child activity of this one calls its finish method.
     * This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity
     * and starts the previous activity.
     * If the last child activity just called finish(),this activity (the parent),
     * calls finish to finish the entire group.
     */
    @Override
    public void finishFromChild(Activity child) 
    {
        try
        {
            btnShare.setVisibility(View.GONE);
            LocalActivityManager manager = getLocalActivityManager();
            int index = mIdList.size()-1;

            if (index < 1) 
            {
                finish();
                return;
            }

            manager.destroyActivity(mIdList.get(index), true);
            mIdList.remove(index);
            index--;
            String lastId = mIdList.get(index);
            Intent lastIntent = manager.getActivity(lastId).getIntent();
            Window newWindow = manager.startActivity(lastId, lastIntent);           
            setContentView(newWindow.getDecorView());
            //Set Heading text to current Id
            txtViewHeading.setText(getActivityHeading(lastId));     
            //Set Back button text to previous Id if applicable
            btnBack.setVisibility(View.VISIBLE);                
            //Back button
            String backId =  "";
            if(mIdList.size() > 1)
            {
                backId = mIdList.get(mIdList.size()-2);
                btnBack.setVisibility(View.VISIBLE);
                btnBack.setText(getActivityHeading(backId));
                txtViewHeading.setPadding(10,0,0,0);
            }
            else 
            {
                btnBack.setVisibility(View.GONE);
                txtViewHeading.setPadding(0,0,0,0);
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
    * Starts an Activity as a child Activity to this.
    * @param Id Unique identifier of the activity to be started.
    * @param intent The Intent describing the activity to be started.
    */
    public void startChildActivity(String Id, Intent intent) 
    {
        try
        {
            btnShare.setVisibility(View.GONE);
            Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
            if (window != null) 
            {
                mIdList.add(Id);
                setContentView(window.getDecorView());
                txtViewHeading.setText(getActivityHeading(Id));
                //Back button
                String backId =  "";
                if(mIdList.size() > 1)
                {
                    backId = mIdList.get(mIdList.size()-2);
                    btnBack.setVisibility(View.VISIBLE);
                    btnBack.setText(backId);
                    txtViewHeading.setPadding(5,0,0,0);
                }
                else 
                {
                    btnBack.setVisibility(View.GONE);
                    txtViewHeading.setPadding(0,0,0,0);
                }                   
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
    * The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR
    * from calling their default KeyEvent.KEYCODE_BACK during onKeyDown.
    */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        if (keyCode == KeyEvent.KEYCODE_BACK) 
        {
            //preventing default
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
    * Overrides the default implementation for KeyEvent.KEYCODE_BACK
    * so that all systems call onBackPressed().
    */
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) 
    {
        if (keyCode == KeyEvent.KEYCODE_BACK) 
        {
            onBackPressed();
            return true;
        }
        return super.onKeyUp(keyCode, event);
    }

    /**
    * If a Child Activity handles KeyEvent.KEYCODE_BACK.
    * Simply override and add this method.
    */
    @Override
    public void onBackPressed () 
    {
        try
        {
            btnShare.setVisibility(View.GONE);
            int length = mIdList.size();
            if ( length > 1) 
            {
                Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
                current.finish();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }   

    /**
    * Get the correct heading text and language based on activity id
    */
    public String getActivityHeading(String id)
    {
        // method that returns the TEXT for my main heading TextView based on the activity we're on...          
    }               

}

状态组Activity

public class StatusGroupActivity extends TabGroupActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startChildActivity("Status", new Intent(this,Status.class));
    }    

}

... 所以基本上当我的应用加载时,我的选项卡在底部,我的 header 在顶部,"tab content" 在中间。在我的状态 activity 中,我可以使用 ...

从中加载另一个 activity
Intent intent = new Intent(getParent(), SomeOtherActivity.class)
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
parentActivity.startChildActivity("Some Other Activity", intent);

... 并将 SomeOtherActivity activity 加载到内容区域。按回键会返回“状态”屏幕。

非常感谢将其转换为使用 Fragments 的任何指示、示例和帮助。我很乐意捐出 500 个代表。完整示例的分数。

main.xml(主要 Activity 布局文件)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    tools:ignore="ContentDescription,HardcodedText" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <ImageView
                android:id="@+id/imageSuccess"
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:adjustViewBounds="true"
                android:scaleType="matrix"
                android:src="@drawable/bg_navbar_blank" />

            <com.myproject.android.BgButtonStyle
                android:id="@+id/btnBack"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginTop="0dp"
                android:background="@drawable/back_button"
                android:text=""
                android:textColor="@color/White"
                android:textSize="12sp"
                android:visibility="visible"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:padding="5dp"/>

            <ImageButton
                android:id="@+id/btnShare"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="15dp"
                android:background="@null"
                android:src="@drawable/icon_share"
                android:visibility="visible"
                android:adjustViewBounds="false"
                android:scaleType="fitXY"/>

            <com.myproject.android.AutoResizeTextView
                android:id="@+id/txtViewHeading"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:paddingLeft="5dp"
                android:text="Status"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textSize="28sp"
                android:textStyle="bold"
                android:paddingRight="5dp"
                android:layout_toEndOf="@id/btnBack"
                android:layout_toStartOf="@id/btnShare"
                android:layout_centerVertical="true"
                android:lines="1"/>

        </RelativeLayout>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" >
        </FrameLayout>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="-4dp"
            android:layout_weight="0"
            android:background="@drawable/bg_tabs">

        </TabWidget>
    </LinearLayout>

</android.support.v4.app.FragmentTabHost>

在我当前的 TabGroupActivityclass 中,在 finishFromChild 和 startChildActivity 方法中,我能够在我的主 [=47= 中的 txtViewHeading TextView 元素上调用 setText ] 布局。这是当前的活动 "title"。如果群组中的人数超过 1 activity,则后退按钮显示上一个标题。如何在下面的示例中复制它? activity 的主要布局与我的大不相同。

将这些依赖项添加到您的项目中:

compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'

首先更改你的 Main activity 必须从 AppCompatActivity 扩展。

然后像下面这样更改主要 activity 的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/coordinatorlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".Main">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbarlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <include
            layout="@layout/toolbar_default"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:tabGravity="fill"
            app:tabMaxWidth="0dp"
            app:tabIndicatorHeight="4dp"
            app:tabMode="fixed"
            app:tabIndicatorColor="@android:color/white"
            android:background="@color/AppPrimary"/>
    </android.support.design.widget.AppBarLayout>

   <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".dashboard.DashboardActivity"
    tools:showIn="@layout/activity_dashboard">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

</android.support.design.widget.CoordinatorLayout>

这是一个工具栏布局示例。您可以根据需要进行自定义。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar_main"
    style="@style/Widget.MyApp.Toolbar.Solid"
    android:layout_width="match_parent"
    android:layout_height="@dimen/abc_action_bar_default_height_material"
    android:background="@color/AppPrimary"
    app:contentInsetEnd="16dp"
    app:contentInsetStart="16dp" />

您需要创建将在选项卡中使用的片段,而不是用于选项卡的活动。在这种情况下,如果我没记错的话,这就是你的 Status Activity

像下面这样定义 StatusFragment:

public class StatusFragment extends Fragment
{
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // this is your Status fragment. You can do stuff which you did in     Status activity
    }
}

然后您需要定义一个选项卡适配器,您将其与您的选项卡绑定并将您的 TabHost 转换为 Fragment/Fragment 管理器类型。标题字符串数组包含您将在制表符指示器中显示的字符串。比如“Status, My Assume Tab, My awesome tab 2

public class DashboardTabsAdapter extends FragmentPagerAdapter {
    private String[] mTitles;

    public DashboardTabsAdapter(FragmentManager fm, String[] titles) {
        super(fm);
        this.mTitles = titles;
    }

    @Override
    public Fragment getItem(int position) {
        return new StatusFragment();
        // You can define some other fragments if you want to do different types of operations in your tabs and switch this position and return that kind of fragment.
    }

    @Override
    public int getCount() {
        return mTitles.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mTitles[position];
    }
}

最后在您的 Main activity 中找到您的视图寻呼机,选项卡创建一个新的适配器并绑定它们。

        final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        final DashboardTabsAdapter dashboardTabsAdapter = new DashboardTabsAdapter(getSupportFragmentManager(), getResources().getStringArray(R.array.tab_titles));
        mViewPagerMain = (ViewPager) findViewById(R.id.viewpager_main);
        mViewPagerMain.setOffscreenPageLimit(3);
        mViewPagerMain.setAdapter(dashboardTabsAdapter);
        tabLayout.setupWithViewPager(mViewPagerMain);

编辑:您将不再需要 TabHostTabActivity。您的选项卡组 activity 将是您的 ViewPager,它处理屏幕更改和内部片段的生命周期。如果您需要从片段中获取此 activity,您可以使用 getActivity() 方法并将其转换为您的 activity 并使用它的 public 方法。

首先您需要将 Design Support LibraryAppCompatLibrary 添加到您的项目中

将此代码添加到您的应用中 gradle

compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.0.0'

activity_main.xml 的布局(就像代码中的 main.xml)

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/appbar_padding_top"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay">

    </android.support.v7.widget.Toolbar>

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>

在上面的布局中 ViewPager 将提供水平布局来显示选项卡。您可以使用选项卡在单个屏幕中显示更多屏幕。您可以快速滑动标签。

根片段

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/root_frame" >

查看 第一个片段

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:background="#ff0"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:text="@string/first_fragment" />
<Button 
    android:id="@+id/btn"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_width="wrap_content"
    android:text="@string/to_second_fragment"/>

 </RelativeLayout>

查看 第二个人片段

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin">

<TextView
    android:id="@+id/section_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>

现在添加一个 MainActivity(就像您代码中的 Main Activity),所有这些都将在其下处理。

public class MainActivity extends AppCompatActivity {

private TabGroupAdapter mTabGroupAdapter;
private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ArrayList<Fragment> fragmentList = new ArrayList<Fragment>();
    fragmentList.add(new RootFragment());
    fragmentList.add(new IndividualFragment1());
    fragmentList.add(new IndividualFragment2());
     ArrayList<String> name = new ArrayList<String>() {
        {
            add("Root Tab");
            add("Second Tab");
            add("Third Tab");
        }
    };
    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mTabGroupAdapter = new TabGroupAdapter(getSupportFragmentManager(),name, fragmentList,);

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mTabGroupAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

}
}

MainActivity 中有一个 FragmentPagerAdapter 定义为 mTabGroupAdapter,它将在单个布局中添加不同的选项卡。

首先我们将 mTabGroupAdapter 绑定到 mViewPager

TabLayout 将像 TabHost 一样工作,FragmentPagerAdapter.

将在其下添加 Tab

mViewPager 绑定到 Tablayout.

在 Main 下Activity TabLayout 将显示选项卡的名称。

TabGroupAdapter

 public class TabGroupAdapter extends FragmentPagerAdapter {

    private ArrayList<Fragment> fragmentList = new ArrayList<Fragment>();
    private ArrayList<String> fragment_name;

    public TabGroupAdapter(FragmentManager fm, ArrayList<String> name, ArrayList<Fragment> list) {
        super(fm);
        this.fragmentList = list;
        this.fragment_name = name;
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragment_name.get(position);
    }
}

TabGroupAdapter 中,您将传递 List of fragments(or single fragment)list of fragments name(or single name) 作为构造函数中的参数。

IndividualFragment(s) 将像一个单独的选项卡而不是 Activity。

RootFragment will be acting as a container for other fragments( First Fragment and Second Fragment)

根片段

public  class RootFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.root_fragment, container, false);
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.root_frame, new FirstFragment());
        fragmentTransaction.commit();
        return view;
    }
}

第一个片段

public  class FirstFragment extends Fragment {

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

        Button btn = (Button) view.findViewById(R.id.btn);

        btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            //use the "root frame" defined in
            //"root_fragment.xml" as the reference to replace fragment
             
            fragmentTransaction.replace(R.id.root_frame, new SecondFragment());
            /*
             * allow to add the fragment 
             * to the stack and return to it later, by pressing back
             */
           fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    });
    }
}

第二个片段

public  class SecondFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }
}

个人片段

public  class IndividualFragment1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }
}



public  class IndividualFragment2 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }
}

OnCreateView 方法中,您将设置 Tab 的布局。

You won't have to use the getTabHost() method.

Let me know if you persist any problem.

每当您想动态更改或更新 View Pager 中的选项卡时,只需在 fragmentList 中添加或删除项目,然后在 MainActivity.

中调用此方法 mTabGroupAdapter.notifyDataSetChanged();