效果图:

代码功能:

(1)用ViewPager+Fragment实现TabHost,ViewPager的每一个Page均是Fragment。ViewPager中的Fragment可以动态添加、删除。底部的Tab选项卡点击后选择ViewPager中相应的Fragment。

(2)ViewPager左右侧滑时候,底部的Tab选项卡也跟随相应做出对应的滑动。

MainActivity.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;public class MainActivity extends FragmentActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Fragment newFragment =new  ViewPagerAndFragmentTabHost();FragmentTransaction transaction =getSupportFragmentManager().beginTransaction();transaction.replace(R.id.fragment,newFragment);transaction.commit();}
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><FrameLayout android:id="@+id/fragment"  android:layout_width="match_parent"android:layout_height="match_parent">    </FrameLayout></LinearLayout>

重点是此类:ViewPagerAndFragmentTabHost.java 实现全部功能。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.UUID;import com.example.viewpager_fragment.R;import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;public class ViewPagerAndFragmentTabHost extends Fragment {private MyFragmentPagerAdapter mPagerAdapter;private ViewPager mViewPager;private LinearLayout mLinearLayout;private ArrayList<HashMap<String, Object>> mArrayList = null;private final String FRAGMENT = "fragment_tag", TAB = "tab_tag",UUID_TAG = "uuid_tag";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setHasOptionsMenu(true);mArrayList = new ArrayList<HashMap<String, Object>>();}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View mView = inflater.inflate(R.layout.viewpager_fragment, null);mViewPager = (ViewPager) mView.findViewById(R.id.viewpager);mLinearLayout = (LinearLayout) mView.findViewById(R.id.indicator_LinearLayout);mPagerAdapter = new MyFragmentPagerAdapter(getFragmentManager());mViewPager.setAdapter(mPagerAdapter);mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageSelected(int pos) {set(pos);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});// 初始化,在此,可选initialization();// 初始化选择第一项if (mPagerAdapter.getCount() > 0) {set(0);}return mView;}private void initialization() {// 在这里做初始化工作,如果有指定的Fragment,在此预装载// Fragment fragment;//创建一个Fragment// View view;//一个下方选项卡的View// add(fragment, view);}private void add(Fragment fragment, View indicatorView) {HashMap<String, Object> map = new HashMap<String, Object>();UUID uuid = UUID.randomUUID();map.put(UUID_TAG, uuid);Bundle args = new Bundle();fragment.setArguments(args);map.put(FRAGMENT, fragment);indicatorView.setBackgroundColor(Color.GRAY);LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT, 1);indicatorView.setTag(uuid);mLinearLayout.addView(indicatorView, params);indicatorView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {setIndicatorViewSelected(v);}});map.put(TAB, indicatorView);mArrayList.add(map);}private void setIndicatorViewSelected(View v) {UUID uuid = (UUID) v.getTag();for (int i = 0; i < mArrayList.size(); i++) {HashMap<String, Object> map = mArrayList.get(i);if (uuid == map.get(UUID_TAG)) {set(i);}}}private final void delete(int pos) {UUID uuid = (UUID) mArrayList.get(pos).get(UUID_TAG);View view = mLinearLayout.findViewWithTag(uuid);mLinearLayout.removeView(view);mArrayList.remove(pos);mPagerAdapter.notifyDataSetChanged();}private void setIndicatorViewSelectedColor(int pos) {for (int i = 0; i < mArrayList.size(); i++) {HashMap<String, Object> map = mArrayList.get(i);View view = (View) map.get(TAB);if (i == pos)view.setBackgroundColor(Color.RED);elseview.setBackgroundColor(Color.GRAY);}}private void set(int pos) {mViewPager.setCurrentItem(pos, true);setIndicatorViewSelectedColor(pos);}private class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {public MyFragmentPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int pos) {return (Fragment) mArrayList.get(pos).get(FRAGMENT);}@Overridepublic int getItemPosition(Object object) {return FragmentPagerAdapter.POSITION_NONE;}@Overridepublic int getCount() {return mArrayList.size();}}private Fragment loadFragment() {return new TestFragment();}private View loadIndicatorView(int pos) {TextView tv = new TextView(getActivity());tv.setGravity(Gravity.CENTER);tv.setText("Tab " + pos);return tv;}protected void onActionAdd() {add(loadFragment(), loadIndicatorView(mPagerAdapter.getCount()));mPagerAdapter.notifyDataSetChanged();}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.action_add:onActionAdd();break;case R.id.action_dele:delete(mViewPager.getCurrentItem());set(mViewPager.getCurrentItem());break;default:break;}return super.onOptionsItemSelected(item);}@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {inflater.inflate(R.menu.main, menu);}//// 仅仅用于测试的Fragment,在ViewPager中加载//public static class TestFragment extends Fragment {private final int seq = new Random().nextInt(20);@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {TextView tv = new TextView(getActivity());String str = "Fragment Seq : " + seq + "\n";for (int i = 0; i < 500; i++)str = str + i + "--";tv.setTextColor(Color.LTGRAY);tv.setText(str);return tv;}}
}

ViewPagerAndFragmentTabHost.java 需要的 viewpager_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><FrameLayout android:layout_weight="1"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout><LinearLayoutandroid:id="@+id/indicator_LinearLayout"android:layout_width="match_parent"android:layout_height="50dip"android:orientation="horizontal" ></LinearLayout></LinearLayout>

res\menu\main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/action_add"android:orderInCategory="100"android:showAsAction="never"android:title="添加"/><itemandroid:id="@+id/action_dele"android:orderInCategory="100"android:showAsAction="never"android:title="删除"/>
</menu>


ViewPager+Fragment实现TabHost,Fragment动态添加、删除,Tab选项卡跟随滑动相关推荐

  1. jQuery使用toggleClass方法动态添加删除Class样式的方法

    本文实例讲述了jQuery使用toggleClass方法动态添加删除Class样式的方法.分享给大家供大家参考.具体分析如下: jQuery通过toggleClass方法动态添加删除Class,一次执 ...

  2. 使用API动态添加删除菜单项

    使用API动态添加删除菜单项 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  3. android仿微信发布动态功能,Android GridView扩展仿微信微博发图动态添加删除图片功能.pdf...

    Android GridView扩扩展展仿仿微微信信微微博博发发图图动动态态添添加加删删除除图图片片功功能能 这篇文章主要为大家详细介绍了Android GridView扩展仿微信微博发图动态添加删除 ...

  4. 动态添加/删除HTML元素

    动态添加/删除HTML元素 <HTML> <HEAD> <title>动态添加/删除HTML元素</title> <style type=&quo ...

  5. android 动态添加删除控件,求教Android,动态添加到控件能动态删除吗?

    protected View createView() {//动态添加组件 Button btn = new Button(this);//动态创建按钮 btn.setId(index++); btn ...

  6. Krpano全景:在javascript中动态添加/删除/修改(位置)热点(向后端写入)

    目录 接下来看在JS中的方法: 1.手动添加热点(点击图上添加点) 2.查找热点 3.修改热点 4.删除热点 其他方法 作为管理员,在管理全景时会涉及到各个标签的操作,本篇文章介绍在JS中对热点的操作 ...

  7. Krpano学习:在javascript中动态添加/删除/修改(位置)热点(向后端写入)

    作为管理员,在管理全景时会涉及到各个标签的操作,本篇文章介绍在JS中对热点的操作,其数据可传到后端并写入数据库. 首先先给一个在xml文件中的动态热点添加的方法,下面的代码直接把两个url图片换了就可 ...

  8. Quartz 分布式定时任务动态添加删除定时任务

    首先对于Quartz的原理和使用这里不再做赘述和讲解,相信大家可以自信查阅文档进行使用.先说一下个人的这个使用背景:项目中需要引入定时任务,框架是springcloud分布式系统然后调研之后决定引入Q ...

  9. MFC : 给主菜单动态添加删除一级子菜单

    添加删除一级子菜单 private:BOOL AddDyMenu(DWORD dwMenuRcId, TCHAR* pMenuName);BOOL DelDyMenu(TCHAR* pMenuName ...

最新文章

  1. mysql 的not null 与 null的区别(转,恍然大悟)
  2. springboot配置文件加载位置
  3. dataframe的重设index
  4. 区块链预言机(4)内在机制
  5. java 关闭另一个jvm_JVM安全退出(如何优雅的关闭java服务)
  6. 微软发布新的 Azure Pipelines 功能和集成
  7. 和项目组研究计算几何
  8. 二分查找——A-B数对(洛谷 P1102)
  9. tree(2018.10.26)
  10. 最新PP点点通V2008简体中文版免费下载
  11. 泛函分析 04.06 有界线性算子 - 习题课
  12. mysql怎么没有中文手册_mysql 中文手册
  13. 10款实用苹果Siri快捷指令分享
  14. qt+mysql开发提示driver not loaded driver not loaded
  15. 64位驱动 hp630打印机_hp1020打印机64位驱动下载
  16. Fortran和C/C++混合编程学习笔记(一):编译链接
  17. c#:mvc单选按钮(性别)
  18. WPS中VBA控制word时出现调用错误
  19. 修改监控录像时间的方法以及基础常识,必看!...
  20. 5G第一英里的“遭遇战”

热门文章

  1. CSS的几个属性display,float,clear,overflow,visibility
  2. spring的bean定义真的和顺序无关?
  3. Log4J配置 category, appender,layout
  4. Golang 连接Kafka
  5. Hibernate 中的DetachedCriteria。
  6. 分享一个帮助用户全屏阅读的jQuery插件 - jQuery fullscreen
  7. Response.ContentType 详细列表
  8. [转]布隆过滤器详解
  9. XE Delphi 判断字符为中文的方法
  10. 【Python】学习笔记7-异常处理try。。except .. as e ....else