首页 > 代码库 > 安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost

之前2篇文章的链接:

安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航)

安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航)

 

关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了。

国际惯例,先来张效果图:

 

下面直接上代码了,注释很全,看过我前2篇文章的朋友,肯定秒懂的,哈哈~

 

activity_main.xml(主布局文件)

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="fill_parent" 4     android:layout_height="fill_parent" 5     android:orientation="vertical" > 6  7     <!-- 存放主要页面内容 --> 8  9     <FrameLayout10         android:id="@+id/maincontent"11         android:layout_width="fill_parent"12         android:layout_height="0dp"13         android:layout_weight="1" >14     </FrameLayout>15     16     <!-- 底层菜单 -->17 18     <android.support.v4.app.FragmentTabHost19         android:id="@android:id/tabhost"20         android:layout_width="fill_parent"21         android:layout_height="wrap_content"22         android:background="@drawable/maintab_toolbar_bg" >23 24         <FrameLayout25             android:id="@android:id/tabcontent"26             android:layout_width="0dp"27             android:layout_height="0dp"28             android:layout_weight="0" >29         </FrameLayout>30     </android.support.v4.app.FragmentTabHost>31 32 </LinearLayout>

 

fragment.xml(由于只有文字不同,这里只给出一个)

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="fill_parent" 4     android:layout_height="fill_parent" 5  > 6  7  8     <TextView  9         android:id="@+id/text"10         android:layout_width="wrap_content"11         android:layout_height="wrap_content"12         android:layout_centerInParent="true"13         android:text="我是第一个Fragment"14         android:textSize="20dp"15         />16 17 18 </RelativeLayout>

 

tabcontent.xml(具体底部菜单详细布局)

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="wrap_content" 4     android:layout_height="wrap_content" 5     android:gravity="center_horizontal" 6     android:orientation="vertical" > 7  8     <ImageView  9         android:id="@+id/image"10         android:layout_height="wrap_content"11         android:layout_width="wrap_content"12         />13     <TextView 14         android:id="@+id/text"15         android:padding="2dp"16         android:layout_width="wrap_content"17         android:layout_height="wrap_content"18         android:textColor="@android:color/white"19         />20 21 22 </LinearLayout>

 

bt_selector.xml(底部菜单点击背景)

1 <?xml version="1.0" encoding="utf-8"?>2 <selector xmlns:android="http://schemas.android.com/apk/res/android">3 4     <item android:drawable="@drawable/home_btn_bg" android:state_pressed="true"></item>5     <item android:drawable="@drawable/home_btn_bg" android:state_selected="true"></item>6 7 </selector>

 

bt_home_selector.xml(底部菜单按钮效果)

1 <?xml version="1.0" encoding="utf-8"?>2 <selector xmlns:android="http://schemas.android.com/apk/res/android">3 4     <item android:drawable="@drawable/icon_home_sel" android:state_selected="true"></item>5     <item android:drawable="@drawable/icon_home_nor"></item>6 7 </selector>

 

FragmentPage1-FragmentPage5.java

 1 package com.example.newtabhosttest; 2  3 import android.os.Bundle; 4 import android.support.annotation.Nullable; 5 import android.support.v4.app.Fragment; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 import android.view.ViewGroup; 9 10 public class FragmentPage1 extends Fragment{11         @Override12         public View onCreateView(LayoutInflater inflater,13                 @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {14             return inflater.inflate(R.layout.fragment1, null);15         }16 17 }

 

MainActivity.java(主代码)

 1 package com.example.newtabhosttest; 2  3 import android.os.Bundle; 4 import android.support.v4.app.FragmentActivity; 5 import android.support.v4.app.FragmentTabHost; 6 import android.view.View; 7 import android.widget.ImageView; 8 import android.widget.TabHost.TabSpec; 9 import android.widget.TextView;10 11 public class MainActivity extends FragmentActivity {12 13     private FragmentTabHost fragmentTabHost;14     private String texts[] = { "首页", "消息", "好友", "广场", "更多" };15     private int imageButton[] = { R.drawable.bt_home_selector,16             R.drawable.bt_message_selector, R.drawable.bt_selfinfo_selector,R.drawable.bt_square_selector ,R.drawable.bt_more_selector};17      private Class fragmentArray[] = {FragmentPage1.class,FragmentPage2.class,FragmentPage3.class,FragmentPage4.class,FragmentPage5.class};  18 19     @Override20     protected void onCreate(Bundle savedInstanceState) {21         super.onCreate(savedInstanceState);22         setContentView(R.layout.activity_main);23 24         // 实例化tabhost25         fragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);26         fragmentTabHost.setup(this, getSupportFragmentManager(),27                 R.id.maincontent);28 29         for (int i = 0; i < texts.length; i++) {30             TabSpec spec=fragmentTabHost.newTabSpec(texts[i]).setIndicator(getView(i));31             32             fragmentTabHost.addTab(spec, fragmentArray[i], null);33             34             //设置背景(必须在addTab之后,由于需要子节点(底部菜单按钮)否则会出现空指针异常)35             fragmentTabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.bt_selector);36         }37 38     }39 40     private View getView(int i) {41         //取得布局实例42         View view=View.inflate(MainActivity.this, R.layout.tabcontent, null);43         44         //取得布局对象45         ImageView imageView=(ImageView) view.findViewById(R.id.image);46         TextView textView=(TextView) view.findViewById(R.id.text);47         48         //设置图标49         imageView.setImageResource(imageButton[i]);50         //设置标题51         textView.setText(texts[i]);52         return view;53     }54 55 }

 

到这里代码就结束了,要是有哪里疑惑的朋友可以给我留言,如果觉得文章对您有用的话,请给个赞,谢谢支持!^_^

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)