Fragment之底部导航栏的实现

Posted 葡萄干是个程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fragment之底部导航栏的实现相关的知识,希望对你有一定的参考价值。

转载自: 点击打开链接

在Part 4我们回顾了一下Fragment的基本概念,在本节中我们就来学习Fragment应用的简单例子吧!

就是使用Fragment来实现简单的底部导航栏,先贴下效果图:

 

看上去很简单,实现起来也是很简单的哈!那么接着下来就看下实现的流程图吧:

 

实现流程图:

 

 

看完流程图是不是有大概的思路了,那么接着就开始代码的编写吧:

 

代码实现:

①先写布局,布局的话很简单,一个FrameLayout用来放Fragment,底部一个大的LinearLayout

放着三个小Item,每个Item的布局如下:

<relativelayout android:id="@+id/setting_layout" android:layout_height="match_parent" android:layout_weight="1" android:layout_width="0dp">  
   
            <linearlayout android:layout_centervertical="true" android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="vertical">  
   
                <imageview android:id="@+id/setting_image" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/ic_tabbar_settings_normal">  
   
                <textview android:id="@+id/setting_text" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="设置" android:textcolor="#7597B3">  
            </textview></imageview></linearlayout>  
        </relativelayout>
copy多两个,改下图片,文本资源就可以了,完整布局代码如下:

 

activity_main.xml

<linearlayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">  
     
    <framelayout android:id="@+id/content" android:layout_height="0dp" android:layout_weight="1" android:layout_width="match_parent">  
    </framelayout>  
     
    <linearlayout android:background="#FFFFFF" android:layout_height="60dp" android:layout_width="match_parent">  
   
        <relativelayout android:id="@+id/course_layout" android:layout_height="match_parent" android:layout_weight="1" android:layout_width="0dp">  
   
            <linearlayout android:layout_centervertical="true" android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="vertical">  
   
                <imageview android:id="@+id/course_image" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/ic_tabbar_course_normal">  
   
                <textview android:id="@+id/course_text" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="日程" android:textcolor="#7597B3">  
            </textview></imageview></linearlayout>  
        </relativelayout>  
         
        <relativelayout android:id="@+id/found_layout" android:layout_height="match_parent" android:layout_weight="1" android:layout_width="0dp">  
   
            <linearlayout android:layout_centervertical="true" android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="vertical">  
   
                <imageview android:id="@+id/found_image" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/ic_tabbar_found_normal">  
   
                <textview android:id="@+id/found_text" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="发现" android:textcolor="#7597B3">  
            </textview></imageview></linearlayout>  
        </relativelayout>  
         
         
        <relativelayout android:id="@+id/setting_layout" android:layout_height="match_parent" android:layout_weight="1" android:layout_width="0dp">  
   
            <linearlayout android:layout_centervertical="true" android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="vertical">  
   
                <imageview android:id="@+id/setting_image" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/ic_tabbar_settings_normal">  
   
                <textview android:id="@+id/setting_text" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="设置" android:textcolor="#7597B3">  
            </textview></imageview></linearlayout>  
        </relativelayout>  
                 
         
  </linearlayout>
</linearlayout>

②接着就写三个Fragment的布局,这个看你需要了,这里就一个TextView

 

写完一式三份,复制多两个,改下颜色和文字

fg1.xml

<!--?xml version=1.0 encoding=utf-8?-->
<linearlayout android:background="#FAECD8" android:gravity="center" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
     
    <textview android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="日程表Fragment">
 
</textview></linearlayout>

③接着写三个Fragment的实现类,同样一式三份,改下inflate加载的Fragment即可

 

Fragment1.java

package com.jay.example.fragmentforhost;
 
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
 
public class Fragment1 extends Fragment 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
        View view = inflater.inflate(R.layout.fg1, container,false);
        return view;
    

④接着就到MainActivity的编写了,也很简单,自己看看吧,就不多解释了

 

就定义的几个方法,初始化选项,选中处理,以及隐藏所有Fragment的方法!

MainActivity.java

package com.jay.example.fragmentforhost;
 
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
 
 
 
public class MainActivity extends FragmentActivity implements OnClickListener
 
    //定义3个Fragment的对象
    private Fragment1 fg1;
    private Fragment2 fg2;
    private Fragment3 fg3;
    //帧布局对象,就是用来存放Fragment的容器
    private FrameLayout flayout;
    //定义底部导航栏的三个布局
    private RelativeLayout course_layout;
    private RelativeLayout found_layout;
    private RelativeLayout settings_layout;
    //定义底部导航栏中的ImageView与TextView
    private ImageView course_image;
    private ImageView found_image;
    private ImageView settings_image;
    private TextView course_text;
    private TextView settings_text;
    private TextView found_text;
    //定义要用的颜色值
    private int whirt = 0xFFFFFFFF;
    private int gray = 0xFF7597B3;
    private int blue =0xFF0AB2FB;
    //定义FragmentManager对象
    FragmentManager fManager;
     
     
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fManager = getSupportFragmentManager();
        initViews();
    
     
     
    //完成组件的初始化
    public void initViews()
    
        course_image = (ImageView) findViewById(R.id.course_image);
        found_image = (ImageView) findViewById(R.id.found_image);
        settings_image = (ImageView) findViewById(R.id.setting_image);
        course_text = (TextView) findViewById(R.id.course_text);
        found_text = (TextView) findViewById(R.id.found_text);
        settings_text = (TextView) findViewById(R.id.setting_text);
        course_layout = (RelativeLayout) findViewById(R.id.course_layout);
        found_layout = (RelativeLayout) findViewById(R.id.found_layout);
        settings_layout = (RelativeLayout) findViewById(R.id.setting_layout);
        course_layout.setOnClickListener(this);
        found_layout.setOnClickListener(this); 
        settings_layout.setOnClickListener(this);
    
     
    //重写onClick事件
    @Override
    public void onClick(View view) 
        switch (view.getId()) 
        case R.id.course_layout:
            setChioceItem(0);
            break;
        case R.id.found_layout:
            setChioceItem(1);
            break;
        case R.id.setting_layout:
            setChioceItem(2);
            break;
        default:
            break;
        
         
    
     
     
    //定义一个选中一个item后的处理
    public void setChioceItem(int index)
    
        //重置选项+隐藏所有Fragment
        FragmentTransaction transaction = fManager.beginTransaction();  
        clearChioce();
        hideFragments(transaction);
        switch (index) 
        case 0:
            course_image.setImageResource(R.drawable.ic_tabbar_course_pressed);  
            course_text.setTextColor(blue);
            course_layout.setBackgroundResource(R.drawable.ic_tabbar_bg_click);
            if (fg1 == null)   
                // 如果fg1为空,则创建一个并添加到界面上  
                fg1 = new Fragment1();  
                transaction.add(R.id.content, fg1);  
             else   
                // 如果MessageFragment不为空,则直接将它显示出来  
                transaction.show(fg1);  
              
            break;  
 
        case 1:
            found_image.setImageResource(R.drawable.ic_tabbar_found_pressed);  
            found_text.setTextColor(blue);
            found_layout.setBackgroundResource(R.drawable.ic_tabbar_bg_click);
            if (fg2 == null)   
                // 如果fg1为空,则创建一个并添加到界面上  
                fg2 = new Fragment2();  
                transaction.add(R.id.content, fg2);  
             else   
                // 如果MessageFragment不为空,则直接将它显示出来  
                transaction.show(fg2);  
              
            break;      
         
         case 2:
            settings_image.setImageResource(R.drawable.ic_tabbar_settings_pressed);  
            settings_text.setTextColor(blue);
            settings_layout.setBackgroundResource(R.drawable.ic_tabbar_bg_click);
            if (fg3 == null)   
                // 如果fg1为空,则创建一个并添加到界面上  
                fg3 = new Fragment3();  
                transaction.add(R.id.content, fg3);  
             else   
                // 如果MessageFragment不为空,则直接将它显示出来  
                transaction.show(fg3);  
              
            break;                 
        
        transaction.commit();
    
     
    //隐藏所有的Fragment,避免fragment混乱
    private void hideFragments(FragmentTransaction transaction)   
        if (fg1 != null)   
            transaction.hide(fg1);  
          
        if (fg2 != null)   
            transaction.hide(fg2);  
          
        if (fg3 != null)   
            transaction.hide(fg3);  
          
      
         
     
    //定义一个重置所有选项的方法
    public void clearChioce()
    
        course_image.setImageResource(R.drawable.ic_tabbar_course_normal);
        course_layout.setBackgroundColor(whirt);
        course_text.setTextColor(gray);
        found_image.setImageResource(R.drawable.ic_tabbar_found_normal);
        found_layout.setBackgroundColor(whirt);
        found_text.setTextColor(gray);
        settings_image.setImageResource(R.drawable.ic_tabbar_settings_normal);
        settings_layout.setBackgroundColor(whirt);
        settings_text.setTextColor(gray);
    
 

最后说几句:

代码就上面的一点点,解析也很详细,看多两遍就应该能看懂了,

另外注意一点就是Fragment相关类导入的时候是v4包还是app包!

那里很容易出错的,关于app与v4包的Fragment可以看札记(3)的解析!

恩,这节就写到这里,下一节会实现Fragment与ViewPager的简单应用!

敬请期待!

 

 

本节代码下载:

http://pan.baidu.com/s/1gdel98B


以上是关于Fragment之底部导航栏的实现的主要内容,如果未能解决你的问题,请参考以下文章

Android 中使用RadioGroup+Fragment实现底部导航栏的功能

Android 最常用的四种底部导航栏实现

BottomNavigationView + fragment底部导航栏简单实现

TextView+Fragment实现底部导航栏

首页-底部Tab导航(菜单栏)的实现:FragmentTabHost+ViewPager+Fragment

Android 大杂烩工程之底部导航栏的实现方式