Android-FragmentTabHost的简单使用

    xiaoxiao2026-08-10  20

    FragmentTabHost  是一个TabHost结合Fragment的使用 关键点如下: 1,FragmentTabHost在初始化的时候调用setup()方法,传入需要承载fragment的framelayout容器id。 2,逐步(本例中使用for)添加TabSpec。 #tasHost.newTabSpec(s)这个方法设置的是一个tab的标签,与tabHost.setOnTabChangedListener()->onTabChanged(String s ) 中的s对应 #每一个TabSpec可以设定一个对应的Fragment和View,Fragment就是需要显示的Fragment,View就是界面中tab部分显示的内容。 #view通过setIndicator()方法指定,这个方法可以指定一个String名称,也可以指定一个View(本例使用 View,通过getTabSpecView()返回一个 View,内容有一个ImageView和一个TextView) 如何修改Tab在被选中时的样式变化? 1)在onTabChanged(String s )中可以监听tab的改变事件 2)tabHost.getTabWidget().getChildAt(position); ->可以获取tab中的View,然后对View进行管理,比如修改图片的样式 ImageView iv = view.findViewById(ImageViewResId); iv.setImageSource(xxx); 示例代码: 1, activity_main.xml 添加如下代码,fragment_container用来承载fragment <FrameLayout     android :id= "@+id/fragment_container"     android :layout_width= "match_parent"     android :layout_height= "wrap_content"     android :layout_weight= "1"  /> <android.support.v4.app.FragmentTabHost     android :id= "@+id/tab_host"     android :layout_width= "match_parent"     android :layout_height= "60dp" >     <!--<FrameLayout-->         <!--android:id="@android:id/tabcontent"-->         <!--android:layout_width="0dp"-->         <!--android:layout_height="0dp"-->         <!--android:layout_weight="0" />--> </android.support.v4.app.FragmentTabHost> 2,添加tab_spec的布局item_tab_spec.xml <? xml version= "1.0"  encoding= "utf-8" ?> <LinearLayout  xmlns: android = "http://schemas.android.com/apk/res/android"     android :layout_width= "match_parent"     android :background= "@color/colorTabBackground"     android :layout_height= "match_parent"     android :orientation= "vertical" >     <ImageView         android :layout_marginTop= "5dp"         android :layout_gravity= "center"         android :id= "@+id/tab_spec_imageview"         android :layout_width= "wrap_content"         android :layout_height= "wrap_content"  />     <TextView         android :text= "haha"         android :layout_gravity= "center"         android :id= "@+id/tab_spec_textview"         android :textColor= "@color/colorTabTitleTextNormal"         android :layout_width= "wrap_content"         android :layout_height= "wrap_content"  /> </LinearLayout> 3,MainActivity中定义需要用到的变量 private FragmentTabHost  tabHost ; private int  tabSpecTitle[] = {R.string. notes ,R.string. settings} ; private int  tabSpecImg[] = {R.drawable. docker_tab_note_selector ,R.drawable. docker_tab_setting_selector} ; private Class  fragments[] = {NoteListFragment. class,SettingFragment. class} ; 4,初始化FragmentTabHost //initial FragmentTabHost tabHost = (FragmentTabHost) findViewById(R.id. tab_host) ; tabHost.setup( this, getSupportFragmentManager() R.id. fragment_container) ; for ( int i =  0 i <  fragments. length i++) {     tabHost.addTab( tabHost.newTabSpec(getString( tabSpecTitle[i])).setIndicator(getTabSpecView(i)) , fragments[i] ,null) ; } tabHost.setOnTabChangedListener( this) ; changeTabTextColor( 0) ; /**  * get every view of tab  * it is a view group contains ImageView & TextView which is from item_tab_spec.xml  *  @param  view's current index  *  @return  view of tab  */ private View  getTabSpecView( int i){     View v = LayoutInflater. from( this).inflate(R.layout. item_tab_spec ,null) ;     ImageView iv = (ImageView) v.findViewById(R.id. tab_spec_imageview) ;     TextView tv = (TextView) v.findViewById(R.id. tab_spec_textview) ;     iv.setBackgroundResource( tabSpecImg[i]) ;     tv.setText(getString( tabSpecTitle[i])) ;     return v ; } @Override public void  onTabChanged(String s) {     //get title-text of current tab and change the color to selected.     int position =  tabHost.getCurrentTab() ;     changeTabTextColor(position) ; } /**  * change the color of tab's title-text which is been selected.  *  @param  position   */ public void  changeTabTextColor( int position){     clearTabTextcolor() ;     View v =  tabHost.getTabWidget().getChildAt(position) ;     TextView tv = (TextView) v.findViewById(R.id. tab_spec_textview) ;     tv.setTextColor(getResources().getColor(R.color. colorTabTitleTextSelected)) ; } /**  * set all tab's title-text to default color.  */ public void  clearTabTextcolor(){     for ( int i =  0 i <  tabHost.getTabWidget().getChildCount() i++) {         View v =  tabHost.getTabWidget().getChildAt(i) ;         TextView tv = (TextView) v.findViewById(R.id. tab_spec_textview) ;         tv.setTextColor(getResources().getColor(R.color. colorTabTitleTextNormal)) ;     } } 5,定义tab图标被选中时的样式(这部分可以用代码实现) #注意item的顺序不能错,否则显示不正常 docker_tab_note_selector.xml: <? xml version= "1.0"  encoding= "utf-8" ?> <selector  xmlns: android = "http://schemas.android.com/apk/res/android" >     <item  android :drawable= "@drawable/docker_tab_note_selected"  android :state_selected= "true" />     <item  android :drawable= "@drawable/docker_tab_note_normal"  ></item> </selector> docker_tab_setting_selector.xml: <? xml version= "1.0"  encoding= "utf-8" ?> <selector  xmlns:android= "http://schemas.android.com/apk/res/android" >     <item  android:drawable= "@drawable/docker_tab_setting_selected"  android:state_selected= "true" />     <item  android:drawable= "@drawable/docker_tab_setting_normal" ></item> </selector>
    转载请注明原文地址: https://ju.6miu.com/read-1311045.html
    最新回复(0)