最近在做一个仿电商的APP,由于前面使用了Fragment技术,现在想要在一个Fragment中做出TabHost的界面效果,经过查找资料找到了解决办法,特分享出来!(新人勿喷!)


首先要使用的控件是Support V4里面的控件,XML如图

<android.support.v4.app.FragmentTabHostxmlns:android="http://schemas.android.com/apk/res/android"android:id="@android:id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@+id/action_fun"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TabWidgetandroid:id="@android:id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="0"android:orientation="horizontal"></TabWidget><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_weight="1"><ImageViewandroid:id="@+id/img_scrollbar_fun"android:layout_width="match_parent"android:layout_height="4dp"android:layout_weight="2"android:scaleType="fitXY"android:src="@drawable/scrollbar"/><Viewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="0dp"android:layout_height="0dp"android:layout_weight="0"/><FrameLayoutandroid:id="@+id/realtabcontent"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout></android.support.v4.app.FragmentTabHost>

这个XML是从Support V4中找的控件,多出来的是自定义的动态滚动条。

下面是具体的代码实现,如下

publicclassFUNFragmentextendsFragmentimplementsOnTabChangeListener{publicFUNFragment(){//Requiredemptypublicconstructor}privateFragmentTabHostmTabHost_fun;privateString[]fun_tabs=newString[]{"推荐","标签","关注"};privateImageViewmImgScrollbar_fun;privatefloatlastoffset_fun;@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewlayout=inflater.inflate(R.layout.fragment_fun,container,false);mImgScrollbar_fun=(ImageView)layout.findViewById(R.id.img_scrollbar_fun);initActionBar();//initTabFragment();initTabHost(layout);returnlayout;}privatevoidinitActionBar(){FragmentManagerfm=getChildFragmentManager();FragmentTransactionft=fm.beginTransaction();ActionFragmentactionFragment=newActionFragment();ft.add(R.id.action_fun,actionFragment);actionFragment.setActionName("FUN");ft.commit();}//初始化FragmentTabHostpublicvoidinitTabHost(Viewlayout){mTabHost_fun=(FragmentTabHost)layout.findViewById(android.R.id.tabhost);mTabHost_fun.setup(getActivity(),getChildFragmentManager(),R.id.realtabcontent);mTabHost_fun.setOnTabChangedListener(this);for(inti=0;i<fun_tabs.length;i++){Viewview=getActivity().getLayoutInflater().inflate(R.layout.fun_tabhost_item,null);TextViewmTextView=(TextView)view.findViewById(R.id.tv_fun_tab);mTextView.setText(fun_tabs[i]);mTabHost_fun.addTab(mTabHost_fun.newTabSpec("tag"+i).setIndicator(view),RecFragment.class,null);}}@OverridepublicvoidonTabChanged(StringtabId){intposition=mTabHost_fun.getCurrentTab();//设置滚动动画条setScrollAnimation(position);}//设置privatevoidsetScrollAnimation(intposition){//获取屏幕的宽度WindowManagermWindowManager=(WindowManager)getActivity().getSystemService(Context.WINDOW_SERVICE);Displaydisplay=mWindowManager.getDefaultDisplay();@SuppressWarnings("deprecation")intwidth=display.getWidth();//获取滚动条的偏移量intoffset=width/fun_tabs.length;//使用开源项目nineold设置滚动动画ObjectAnimatorofFloat=ObjectAnimator.ofFloat(mImgScrollbar_fun,"translationX",lastoffset_fun,position*offset);ofFloat.setInterpolator(newDecelerateInterpolator());ofFloat.setDuration(500).start();//前一次偏移的位置lastoffset_fun=position*offset;}}

将此记录下来,也是为自己学习Android做个留念。希望对刚学习Android的朋友有点帮助。