仿饿了么等APP底部菜单(Fragment实现)

Fragment实现的底部菜单导航,是现在很多APP都有的功能,效果就是点击菜单之后,菜单实现图标和颜色的变换

实现起来主要有两种方法,一种是Tabhost,一种是Android3.0之后的Fragment

Fragment,需要加入v4价包

然后icon图标的话,需求自己做,或者去http://www.iconfont.cn/,阿里的图库下载

底部菜单的图标有两种,一种是默认图标,一种是点击菜单之后的图标

UI:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3"
        android:id="@+id/fg_content"/>

     <View
         android:layout_width="match_parent"
         android:layout_height="0.2dp"
         android:background="@color/bg_Gray" />

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/rb_homePage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:button="@null"
            android:drawableTop="@drawable/guide_homepage"
            android:gravity="center_horizontal"
            android:onClick="onHomePageClicked"
            android:text="@string/fragment_menu_homepage"
            android:textColor="@color/tab_text_bg" />

        <RadioButton
            android:id="@+id/rb_order"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:button="@null"
            android:drawableTop="@drawable/guide_order"
            android:gravity="center_horizontal"
            android:onClick="onOrderClicked"
            android:text="@string/fragment_menu_order"
            android:textColor="@color/tab_text_bg" />

        <RadioButton
            android:id="@+id/rb_found"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:button="@null"
            android:drawableTop="@drawable/guide_found"
            android:gravity="center_horizontal"
            android:onClick="onFoundClicked"
            android:text="@string/fragment_menu_found"
            android:textColor="@color/tab_text_bg" />

        <RadioButton
            android:id="@+id/rb_my"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:button="@null"
            android:drawableTop="@drawable/guide_my"
            android:gravity="center_horizontal"
            android:onClick="onMyClicked"
            android:text="@string/fragment_menu_my"
            android:textColor="@color/tab_text_bg" />
    </RadioGroup>

</LinearLayout>

业务实现:

package com.tsc.activities;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.RadioButton;
import android.widget.Toast;

import com.tsc.fragment.AllLineFragment;
import com.tsc.fragment.HomePageFragment;
import com.tsc.fragment.MyFragment;
import com.tsc.fragment.OrderFragment;
import com.tsc.listener.IBtnCallListener;

/**
 *
 *主界面类
 *fragment是3.0以后的东西,为了在低版本中使用fragment就要用到android-support-v4.jar兼容包,
 *而fragmentActivity就是这个兼容包里面的,它提供了操作fragment的一些方法,其功能跟3.0及以后的版本的Activity的功能一样。
 */
public class MainActivity extends FragmentActivity implements IBtnCallListener{
		//RadioButton
	    private RadioButton mHomePage;
	    private RadioButton mOrder;
	    private RadioButton mFound;
	    private RadioButton mMy;

	    //Fragment界面类
	    private HomePageFragment mHomePageFragment;
	    private OrderFragment mOrderFragment;
	    private AllLineFragment lineFragment;
	    private MyFragment mMyFragment;

	    private Intent intent;
	    private Bundle bundle;

	    private IBtnCallListener mBtnCallListener;  

	    private Bundle sendBundle;

	    private String account;

	    FragmentTransaction ft;

	    @Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        //设置无标题
	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        setContentView(R.layout.activity_main);

	        initView();
	        //初始化选择的Fragment
	        setSelection(3);

	    }

	    /**
	     * 初始化组件
	     */
	    private void initView() {
	        mHomePage = (RadioButton) findViewById(R.id.rb_homePage);
	        mOrder = (RadioButton)findViewById(R.id.rb_order);
	        mFound = (RadioButton) findViewById(R.id.rb_found);
	        mMy = (RadioButton) findViewById(R.id.rb_my);

	    }
	    /**
	     * 点击底部菜单栏后,图标和文字变色的实现
	     * @param index
	     */
	    private void setSelection(int index){
	        resetImg();
	        //创建FragmentTransaction
	        ft = getSupportFragmentManager().beginTransaction();
	        hideFragments(ft);
	        switch (index){
	            case 0:
	            	//变换图标
	            	mHomePage.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.guide_homepage_on, 0, 0);
	            	//变换文字颜色
	            	mHomePage.setTextColor(mHomePage.getResources().getColor(R.color.lightblue));

	                if(mHomePageFragment== null){
	                	mHomePageFragment = new HomePageFragment();

	                	//重新添加到FragmentTransaction
	                    ft.add(R.id.fg_content,mHomePageFragment);

	                }else{
	                    ft.show(mHomePageFragment);
	                }

	                break;
	            case 1:
	            	orderFragmentTransfermsg();
	            	break;
	            case 2:
	            	 mFound.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.guide_found_on, 0, 0);
	            	 mFound.setTextColor(mFound.getResources().getColor(R.color.lightblue));
	            	 if(lineFragment== null){
	                     lineFragment = new AllLineFragment();
	                     ft.add(R.id.fg_content,lineFragment);
	                 }else{
	                     ft.show(lineFragment);
	                 }
	            	break;
	            case 3:
	               myFragmentTransfermsg();
	                break;
	        }
	        ft.commit();
	    }

	    /**
	     *  恢复默认图片
	     */
	    private void resetImg() {
	    	mHomePage.setCompoundDrawablesWithIntrinsicBounds(0,R.drawable.guide_homepage, 0, 0);
	    	mHomePage.setTextColor(mHomePage.getResources().getColor(R.color.tab_text_bg));

	        mOrder.setCompoundDrawablesWithIntrinsicBounds(0,R.drawable.guide_order, 0, 0);
	        mOrder.setTextColor(mOrder.getResources().getColor(R.color.tab_text_bg));

	        mFound.setCompoundDrawablesWithIntrinsicBounds(0,R.drawable.guide_found, 0, 0);
	        mFound.setTextColor(mFound.getResources().getColor(R.color.tab_text_bg));

	        mMy.setCompoundDrawablesWithIntrinsicBounds(0,R.drawable.guide_my, 0, 0);
	        mMy.setTextColor(mMy.getResources().getColor(R.color.tab_text_bg));
	    }
	    /**
	     * 隐藏Fragment
	     * @param ft
	     *
	     */
	    private void hideFragments(FragmentTransaction ft){
	        if(mHomePageFragment != null){
	            ft.hide(mHomePageFragment);
	        }
	        if(mOrderFragment != null){
	            ft.hide(mOrderFragment);
	        }
	        if(lineFragment != null){
	            ft.hide(lineFragment);
	        }
	        if(mMyFragment != null){
	            ft.hide(mMyFragment);
	        }

	    }
	    //选择主页Fragment
	    public void onHomePageClicked(View view){
	        setSelection(0);
	    }
	    //选择消息Fragment
	    public void onOrderClicked(View view){
	    	setSelection(1);
	    }
	    //选择通讯录Fragment
	    public void onFoundClicked(View view){
	        setSelection(2);
	    }
	    //选择我的Fragment
	    public void onMyClicked(View view){
	        setSelection(3);
	    }

	    /**
	     * 按回车键
	     */

	    private long exitTime = 0;

	    @Override
	    public boolean onKeyDown(int keyCode, KeyEvent event) {
	        if (keyCode == KeyEvent.KEYCODE_BACK
	                && event.getAction() == KeyEvent.ACTION_DOWN) {
	            if ((System.currentTimeMillis() - exitTime) > 2000) {
	                Toast.makeText(getApplicationContext(), "再按一次退出程序",
	                        Toast.LENGTH_SHORT).show();
	                exitTime = System.currentTimeMillis();
	            } else {
	                moveTaskToBack(false);
	                finish();

	            }
	            return true;
	        }
	        return super.onKeyDown(keyCode, event);
	    }

	    /**
	     * 重载的onAttachFragment方法
	     */
	    @Override
	    public void onAttachFragment(Fragment fragment) {
	    	try {
	        	 mBtnCallListener=(IBtnCallListener) fragment;
	        } catch (Exception e) {  

	        }
	    	super.onAttachFragment(fragment);
	    }

	    /**
	     * 实现IBtnCallListener接口的抽象方法
	     */
		@Override
		public void myFragmentTransfermsg() {
			mMy.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.guide_my_on, 0, 0);
            mMy.setTextColor(mMy.getResources().getColor(R.color.lightblue));
            if(mMyFragment == null){
                mMyFragment  = new MyFragment();
                //通过Bundle向Fragment类传送参数
                account = getIntent().getStringExtra("account");
                sendBundle = new Bundle();
    			sendBundle.putString("account", account);
    			//设置Arguments
                mMyFragment.setArguments(sendBundle);

                ft.add(R.id.fg_content,mMyFragment);
            }
            ft.show(mMyFragment);
		}

		@Override
		public void homePageFragmentTransfermsg() {
			// TODO Auto-generated method stub

		}

		@Override
		public void orderFragmentTransfermsg() {
			 mOrder.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.guide_order_on, 0, 0);
        	 mOrder.setTextColor(mOrder.getResources().getColor(R.color.lightblue));
        	 if(mOrderFragment== null){
                 mOrderFragment = new OrderFragment();
               //通过Bundle向Fragment类传送参数
                 account = getIntent().getStringExtra("account");
                 sendBundle = new Bundle();
     			sendBundle.putString("account", account);
     			//设置Arguments
                 mOrderFragment.setArguments(sendBundle);
                 ft.add(R.id.fg_content,mOrderFragment);
             }else{
                 ft.show(mOrderFragment);
             }
		}

		@Override
		public void foundFragmentTransfermsg() {
			// TODO Auto-generated method stub

		}

}

时间: 2024-08-09 13:17:41

仿饿了么等APP底部菜单(Fragment实现)的相关文章

【Vue.js】高仿饿了么外卖App(一)

1.架构从传统的MVC向REST API+前端MV*迁移 参考链接: http://blog.csdn.net/broadview2006/article/details/8615055 http://blog.csdn.net/u013628152/article/details/42709033 MV*包括:MVC.MVP.MVVM vue.js是MVVM框架 2.Iconmoon制作图标字体 2.1 点击IconMoon App 2.2点击import icons,导入svg图片 2.3选

Vue.js高仿饿了么外卖App 前端框架Vue.js 1.0升级2.0

课程目录:第1章 课程简介介绍课程的学习目标和学习内容.第2章 Vuejs介绍从前端开发趋势分析开始,引入 MVVM 开发框架和 Vue.js,接着对比流行框架Angular 和 React,最后详细介绍 Vue.js 的核心思想-数据驱动和组件化.第3章 Vue-cli 开启 Vuejs 项目介绍 Vue 项目的脚手架,如何安装,对脚手架生成的目录文件做介绍,介绍 Vue 组件的编写方法,最后运行 demo 项目并介绍 webpack 构建脚本来说明 demo 的运行原理.第4章 项目实战-准

Vue.js 高仿饿了么外卖APP

第1章 课程简介介绍课程的学习目标和学习内容.1-1 课程简介1-2 课程安排 第2章 Vuejs介绍从前端开发趋势分析开始,引入 MVVM 开发框架和 Vue.js,接着对比流行框架Angular 和 React,最后详细介绍 Vue.js 的核心思想-数据驱动和组件化.2-1 Vuejs介绍-近年来前端开发趋势2-2 Vuejs介绍-MVVM框架2-3 Vuejs介绍-什么是Vuejs及Vuejs生态2-4 Vuejs介绍-对比Angular.React2-5 Vuejs介绍-Vuejs核心

Vue.js高仿饿了么外卖App 2016最火前端框架

第1章 课程导学(二期)-15号开放 包括课程概述.核心模块.核心技术.课程安排.课程收获.讲授方式.学习前提等方面的介绍,最后演示了整个外卖App的功能,让同学们对课程项目有一个直观的了解. 1-1 导学(必看) 第2章 项目准备工作(二期)-15号开放 包括项目需求分析.Vue-cli 3.0 脚手架介绍.cube-ui 介绍.目录模块分析.api 接口 mock 等. 2-1 Vue-cli 3.0 介绍 2-2 目录介绍 & cube-ui 安装 2-3 api 接口 mock 第3章

Android自定义TabActivity(实现仿新浪微博底部菜单更新UI)

如今Android上很多应用都采用底部菜单控制更新的UI这种框架,例如新浪微博 点击底部菜单的选项可以更新界面.底部菜单可以使用TabHost来实现,不过用过TabHost的人都知道自定义TabHost究竟是有多麻烦的,原生TabHost的风格是不依附屏幕的底部的,要依附底部就要重写布局. TabHost设置的Container可以管理UI的显示,UI可以用LayoutInflater动态生成,也可以是Activity,但不好管理Activity的生命周期.然后用TabHost控制显示UI的显示

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

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了. 国际惯例,先来张效果图: 下面

转-Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

http://www.cnblogs.com/lichenwei/p/3985121.html 记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+Vie

仿饿了点餐界面2个ListView联动

如图是效果图 是仿饿了的点餐界面 1.点击左侧的ListView,通过在在适配器中设置Item来改变颜色,再通过notifyDataSetInvalidated来刷新并用lv_home.setSelection(showTitle.get(arg2));来关联右侧的 2.右侧的主要是重写下onScroll的方法:来改变左侧ListView的颜色及背景 不过程序中还有个问题,望大神解答就是我右侧的ListView下拉时,上面的TextView能改变:但是上拉时,TextView的不能及时改变应为滑

用Fragment实现如新浪微博一样的底部菜单的切换

像我这个有强迫症的人来说,自从TabActivity抛弃之后,再使用看到一个个警告和一条条划着的横线,心里很不舒服,现在终于下定决心用Fragment来替换掉TabActivity了!我的研究成果如下: 首先是MainActivity,它需要继承FragmentActivity(这里是指:版本是3.0之前的继承FragmentActivity,3.0版本之后的继承Activity就可以),对于FragmentActivity的声明周期我就不过多介绍了,和Activity差不了多少,自己也能弄明白