Android仿微信主界面的实现方法
时间:2019-04-14
本文章向大家介绍Android仿微信主界面的实现方法,主要包括Android仿微信主界面的实现方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了Android模仿微信主界面展示的具体代码,供大家参考,具体内容如下
先看一下效果图
实现的原理:
ViewPager+FragmentPagerAdapter
主界面可分为三部分:
- top标题栏就是一个TextView
- 中间的ViewPager作为显示的容器,填充Fragment
- bottom是一个RadioGroup
这里为了布局的优化,将top和bottom抽取出来 ,然后用include将其导入主布局,如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <include layout="@layout/top" /> <android.support.v4.view.ViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </android.support.v4.view.ViewPager> <include layout="@layout/bottom" /> </LinearLayout>
bottom_tab的布局,为了方便管理将它们的共性抽取出来一个style
tab有两种状态,选中和非选中,因此将其背景做成一个选择器selector
<?xml version="1.0" encoding="utf-8"?> <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rg_tab_container" android:layout_width="match_parent" android:layout_height="@dimen/bar_height" android:background="@drawable/bottom_bar" android:gravity="center" android:orientation="horizontal" > <RadioButton android:id="@+id/rb_tab_weixin" style="@style/TabStyle" android:checked="true" android:drawableTop="@drawable/tab_weixin_selector" android:text="@string/tab_weixin" /> <RadioButton android:id="@+id/rb_tab_friend" style="@style/TabStyle" android:drawableTop="@drawable/tab_friend_selector" android:text="@string/tab_friend" /> <RadioButton android:id="@+id/rb_tab_contact" style="@style/TabStyle" android:drawableTop="@drawable/tab_contact_selector" android:text="@string/tab_contact" /> <RadioButton android:id="@+id/rb_tab_setting" style="@style/TabStyle" android:drawableTop="@drawable/tab_setting_selector" android:text="@string/tab_setting" /> </RadioGroup>
最后看一下作为Controller的Activity
- 先将需要的控件引入
- ViewPager内容的填充,主要是FragmentPagerAdapter适配器
- 将Fragment的初始化,将主界面显示的内容分别用Fragment管理,方便代码的管理。
- bottom_tab和ViewPager的关联,通过监听ViewPager页面的改变来改变tab的选中状态,然后再通过RadioGroup的事件来改变ViewPager的页面。
/** * 主界面 模仿微信界面 * * @author admin * */ public class MainActivity extends FragmentActivity { /** tab */ private RadioGroup mRadioGroup; private RadioButton weixinRadioButton; private RadioButton friendRadioButton; private RadioButton contactRadioButton; private RadioButton settingRadioButton; /** 显示内容容器 */ private ViewPager mViewPager; private List<Fragment> fragments; private Fragment mWeiXinFragment; private Fragment mFriendFragment; private Fragment mContactFragment; private Fragment mSettingFragment; private FragmentPagerAdapter mFragmentPagerAdapter; private final static int TAB_WEIXIN = 0; private final static int TAB_FRIEND = 1; private final static int TAB_CONTACT = 2; private final static int TAB_SETTING = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initView(); initEvent(); } private void initEvent() { mRadioGroup.setOnCheckedChangeListener(myCheckedChangeListener); mViewPager.setOnPageChangeListener(myOnPageChangeListener); } private void initView() { mRadioGroup = (RadioGroup) findViewById(R.id.rg_tab_container); weixinRadioButton = (RadioButton) findViewById(R.id.rb_tab_weixin); friendRadioButton = (RadioButton) findViewById(R.id.rb_tab_friend); contactRadioButton = (RadioButton) findViewById(R.id.rb_tab_contact); settingRadioButton = (RadioButton) findViewById(R.id.rb_tab_setting); mViewPager = (ViewPager) findViewById(R.id.vp_content); fragments = new ArrayList<Fragment>(); mWeiXinFragment = new WeiXinFragment(); mFriendFragment = new FriendFragment(); mContactFragment = new ContactFragment(); mSettingFragment = new SettingFragment(); fragments.add(mWeiXinFragment); fragments.add(mFriendFragment); fragments.add(mContactFragment); fragments.add(mSettingFragment); //这里需要继承FragmentActivity mFragmentPagerAdapter = new FragmentAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mFragmentPagerAdapter); } /** * 当页面切换时,tab也跟着切换 */ private OnPageChangeListener myOnPageChangeListener = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { switch (arg0) { case TAB_WEIXIN: if (!weixinRadioButton.isChecked()) { weixinRadioButton.setChecked(true); } break; case TAB_FRIEND: friendRadioButton.setChecked(true); break; case TAB_CONTACT: contactRadioButton.setChecked(true); break; case TAB_SETTING: settingRadioButton.setChecked(true); break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }; /** * 点击tab,切换到相应的页面 */ private OnCheckedChangeListener myCheckedChangeListener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb_tab_weixin: mViewPager.setCurrentItem(TAB_WEIXIN); break; case R.id.rb_tab_friend: mViewPager.setCurrentItem(TAB_FRIEND); break; case R.id.rb_tab_contact: mViewPager.setCurrentItem(TAB_CONTACT); break; case R.id.rb_tab_setting: mViewPager.setCurrentItem(TAB_SETTING); break; } } }; private class FragmentAdapter extends FragmentPagerAdapter { public FragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int arg0) { return fragments.get(arg0); } @Override public int getCount() { return fragments.size(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- HDUOJ----1181 变形课
- 正确的Win主机网站伪静态设置方法
- HDUOJ----(1084)What Is Your Grade?
- HDUOJ------(1272)小希的迷宫
- HDUOJ ---1269迷宫城堡
- HDUOJ---1213How Many Tables
- hduoj----(1033)Edge
- HDUOJ----(1031)Design T-Shirt
- HDUOJ----(1030)Delta-wave
- 身份切换脚本,免登入切换权限的利器
- HDUOJ---What Are You Talking About
- HDUOJ-----(1251)统计难题
- HDUOJ-----1541 Stars
- HDUOJ--------(1198)Farm Irrigation
- 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 文档注释
- 初探 TensorFlow.js
- 如何使用 Apache Directory Studio 连接 JumpCloud
- 0812-5.16.2-如何获取CDSW上提交Spark作业的真实用户
- GLMM:广义线性混合模型(遗传参数评估)
- 特征锦囊:今天一起搞懂机器学习里的L1与L2正则化
- 【一天一大 lee】二叉搜索树的最近公共祖先 (难度:简单) - Day2020092
- Spring多数据源事务如何玩? | Spring系列46篇
- 使用Mfuzz包做时间序列分析
- 网络安全 | 瑞哥带你全方位解读防火墙技术!
- 【SpringBoot DB 系列】Jooq 之新增记录使用姿势
- 突击并发编程JUC系列-并发工具 Semaphore
- 构建Linux根文件系统
- ARM指令ldr和adr的区别
- 挂载文件系统出现"kernel panic..." 史上最全解决方案
- 汇编程序调用c函数为什么需要设置栈?