Android实现美团APP的底部滑动菜单
时间:2022-07-27
本文章向大家介绍Android实现美团APP的底部滑动菜单,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
仿美团APP的底部滑动菜单Android实现,供大家参考,具体内容如下
在现在的APP的应用中,类似仿美团APP的底部滑动菜单,应用是挺多的,例如QQ,微信,支付宝都应用到。开发流程如下
1. 底部按钮
底部按钮使用RadioButton。
// 按钮布局
<LinearLayout
android:id="@+id/llradiogroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
<RadioGroup
android:id="@+id/rg_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
<RadioButton
android:id="@+id/rbtn_home"
style="@style/RadioButton"
android:checked="true"
android:drawableTop="@drawable/home"
android:text="首页" /
<RadioButton
android:id="@+id/rbtn_vest"
style="@style/RadioButton"
android:drawableTop="@drawable/investment"
android:text="投资" /
<RadioButton
android:id="@+id/rbtn_photo"
style="@style/RadioButton"
android:drawableTop="@drawable/shooting"
android:text="拍拍" /
<RadioButton
android:id="@+id/rbtn_mine"
style="@style/RadioButton"
android:drawableTop="@drawable/recom_member"
android:text="我的" /
<RadioButton
android:id="@+id/rbtn_more"
style="@style/RadioButton"
android:drawableTop="@drawable/more"
android:text="更多" /
</RadioGroup
// style样式
<style name="RadioButton"
<item name="android:layout_width" match_parent</item
<item name="android:layout_height" 60dp</item
<item name="android:gravity" center</item
<item name="android:layout_weight" 1</item
<item name="android:button" @null</item
<item name="android:background" @drawable/menueselector</item
</style
style样式中的menueselector为背景选择器,使按钮选中变色
在Res目录下新建文件夹(drawable-nodpi),在里面建立新的xml文件,选择资源类型为Drawable的selector,在每一个selector中建立item选项
<?xml version="1.0" encoding="utf-8"?
<selector xmlns:android="http://schemas.android.com/apk/res/android"
<!--选中背景颜色--
<item android:drawable="@color/checked" android:state_checked="true" /
<!--未选中背景颜色--
<item android:drawable="@color/nochecked" android:state_checked="false" /
</selector
2. 中间的滑动窗口
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/llradiogroup"
</android.support.v4.view.ViewPager
3. 往滑动窗口添加按钮对应的Fragment, 并监听相应事件
下面的代码注意两点
- MainActivity需继承于FragmentActivity,这样才能找到其中的getSupportFragmentManager()方法
- 在书写Fragment时切记引入的是android.support.v4.app.Fragment,而非android.app.Fragment(android.app.Fragment是在3.0引入的,为了兼容更低版本首选android.support.v4.app.Fragment)
package com.lsw.wealthapp.activity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import com.lsw.wealthapp.R;
import com.lsw.wealthapp.fragment.CaptureFragment;
import com.lsw.wealthapp.fragment.HomeFragment;
import com.lsw.wealthapp.fragment.InvestmentFragment;
import com.lsw.wealthapp.fragment.MoreFragment;
import com.lsw.wealthapp.fragment.MyFragment;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity {
// HomeFragmentIndex
private static final int HomeViewPagerIndex = 0;
// InvestmentFragmentIndex
private static final int InvsetViewPagerIndex = 1;
// CaptureFragmentIndex
private static final int CaptureViewPagerIndex = 2;
// MyFragmentIndex
private static final int MyViewPagerIndex = 3;
// MoreFragmentIndex
private static final int MoreViewPagerIndex = 4;
private ViewPager viewPager;
// 主页页面
private HomeFragment homeFragment;
// 投资页面
private InvestmentFragment investmentFragment;
//拍照页面
private CaptureFragment captureFragment;
// 我的页面
private MyFragment myFragment;
// 更多页面
private MoreFragment moreFragment;
// Fragment集合
private List<Fragment fragmentList;
// FragmentAdapter
private MyPageFramgentAdapter myPageFramgentAdapter;
// 菜单RadioGroup
private RadioGroup radioGroup;
// 主页按钮
private RadioButton rbtnHome;
// 投资按钮
private RadioButton rbtnInvest;
// 拍照按钮
private RadioButton rbtnCapture;
// 我的按钮
private RadioButton rbtnMine;
// 更多按钮
private RadioButton rbtnMore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
viewPager = (ViewPager) findViewById(R.id.viewPager);
homeFragment = new HomeFragment();
investmentFragment = new InvestmentFragment();
captureFragment = new CaptureFragment();
myFragment = new MyFragment();
moreFragment = new MoreFragment();
fragmentList = new ArrayList<Fragment ();
radioGroup = (RadioGroup) findViewById(R.id.rg_menu);
rbtnHome = (RadioButton) findViewById(R.id.rbtn_home);
rbtnInvest = (RadioButton) findViewById(R.id.rbtn_vest);
rbtnCapture = (RadioButton) findViewById(R.id.rbtn_photo);
rbtnMine = (RadioButton) findViewById(R.id.rbtn_mine);
rbtnMore = (RadioButton) findViewById(R.id.rbtn_more);
// 按钮选中,viewPager展示对应的页面
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
switch (i) {
case R.id.rbtn_home:
viewPager.setCurrentItem(HomeViewPagerIndex);
break;
case R.id.rbtn_vest:
viewPager.setCurrentItem(InvsetViewPagerIndex);
break;
case R.id.rbtn_photo:
viewPager.setCurrentItem(CaptureViewPagerIndex);
break;
case R.id.rbtn_mine:
viewPager.setCurrentItem(MyViewPagerIndex);
break;
case R.id.rbtn_more:
viewPager.setCurrentItem(MoreViewPagerIndex);
break;
}
}
});
//将Fragment加入集合中
fragmentList.add(homeFragment);
fragmentList.add(investmentFragment);
fragmentList.add(captureFragment);
fragmentList.add(myFragment);
fragmentList.add(moreFragment);
FragmentManager fm = getSupportFragmentManager();
myPageFramgentAdapter = new MyPageFramgentAdapter(fm);
viewPager.setAdapter(myPageFramgentAdapter);
// viewPager发生改变,对应的按钮状态变为选中
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch (position) {
case HomeViewPagerIndex:
rbtnHome.setChecked(true);
break;
case InvsetViewPagerIndex:
rbtnInvest.setChecked(true);
break;
case CaptureViewPagerIndex:
rbtnCapture.setChecked(true);
break;
case MyViewPagerIndex:
rbtnMine.setChecked(true);
break;
case MoreViewPagerIndex:
rbtnMore.setChecked(true);
break;
default:
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
// viewPager所需的适配器
class MyPageFramgentAdapter extends FragmentPagerAdapter {
public MyPageFramgentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 再次扩散:Linux系统bash漏洞CVE-2014-6271仍未被彻底修复,红帽再发补丁
- SEO分享:彻底禁止搜索引擎收录非首选域名的方法
- 紧急扩散:Linux系统bash严重安全漏洞CVE-2014-6271的检测及修复方法
- 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- WordPress评论滑动/拉链解锁myQaptcha代码版及部署方法
- 修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- 解决Crayon Syntax Highlighter代码高亮与fancybox图片暗箱冲突问题
- 移动搜索SEO:网站移动适配之Meta标注、移动跳转终结篇
- http加速器Varnish的vcl配置小记(lnmp环境)
- 关于网站图标favicon.ico那点事儿,你造吗?
- 跨平台 ListView 性能优化
- 打造“微信小程序”组件化开发框架
- 解决Linux下MySQL启动错误Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- [源码解析] Flink UDAF 背后做了什么
- [源码解析] 当 Java Stream 遇见 Flink
- [源码解析] Flink的Slot究竟是什么?(1)
- [源码解析] Flink的Slot究竟是什么?(2)
- [记录点滴] Spark迁移到Flink的几个点
- 深度对比Python的3种“字符串格式化”方法,看看你喜欢哪一种?
- 用Python分析广州房地产市场
- 面试题-JAVA之HashMap-put方法源码分析
- 案例实战 | Python 玩转 AB 测试中的分层抽样与假设检验!(附代码和数据集)
- Python 3.10 明年发布,看看都有哪些新特性?
- R可视化 | 混合多个图形
- 爱了!爱了!一款用 pandas 玩转 SQL 的神器
- 详细了解JS Map,它和传统对象有什么区别?
- Java HelloWorld 學習
- Bytecodes.java