在开始之前,先上一张效果图

突然发现有点知乎的味道。。。的确。。知乎灰#989898,知乎蓝15,136,235(逃。。。。

1、学P图

想我大一的时候也用过不少Adobe的软件,昨天重新打开我的Photoshop,电脑提示缺少什么.dll文件,最后弄了一上午,是因为vc2012的运行库出了问题,最后发现一个软件特别好用:DirectX Repair,可以完美解决.dll丢失的问题。

UI素材我是在google的icons素材库下载的https://github.com/google/material-design-icons

图片变换颜色用到了Photoshop的油漆桶工具

这里每个按钮需要两种颜色,点击时可以达到变换的效果

最后还需要一个可以在页面底部放四个button的图片

最后把这些图片放进drawable-hdpi

2、ContentFragment中绑定控件

  1. package com.vitoyan.myangtzeu.fragment;
  2.  
  3. import android.support.v4.view.ViewPager;
  4. import android.view.View;
  5. import android.widget.RadioGroup;
  6.  
  7. import com.vitoyan.myangtzeu.R;
  8. import com.vitoyan.myangtzeu.base.BaseFragment;
  9. import com.vitoyan.myangtzeu.utils.LogUtil;
  10.  
  11. /**
  12. * 作者:Vito-Yan
  13. * 作用:正文Fragment
  14. */
  15. public class ContentFragment extends BaseFragment {
  16.  
  17. private ViewPager viewpager;
  18. private RadioGroup rg_main;
  19.  
  20. @Override
  21. public View initView() {
  22. LogUtil.e("正文视图被初始化了");
  23. View view = View.inflate(context, R.layout.content_fragment,null);
  24. viewpager = view.findViewById(R.id.viewpager);
  25. rg_main = view.findViewById(R.id.rg_main);
  26. return view;
  27. }
  28.  
  29. @Override
  30. public void initData() {
  31. super.initData();
  32. LogUtil.e("正文数据被初始化了");
  33.  
  34. //设置默认选中首页
  35. rg_main.check(R.id.rb_home);
  36. }
  37.  
  38. }

2、content_fragment.xml是底部按钮的布局文件,在线性布局中包裹RadioGroup,RadioGroup中包裹四个button

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6.  
  7. <com.vitoyan.myangtzeu.view.NoScrollViewPager
  8. android:id="@+id/viewpager"
  9. android:layout_width="match_parent"
  10. android:layout_height="0dp"
  11. android:layout_weight="1" />
  12.  
  13. <RadioGroup
  14. android:id="@+id/rg_main"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:background="@drawable/bottom_tab_bg"
  18. android:orientation="horizontal">
  19.  
  20. <RadioButton
  21. android:id="@+id/rb_home"
  22. android:drawableTop="@drawable/rb_home_drawable_selector"
  23. android:gravity="center"
  24. android:text="首页"
  25. style="@style/bottom_tag_style"
  26. />
  27.  
  28. <RadioButton
  29. android:id="@+id/rb_topic"
  30. android:drawableTop="@drawable/rb_topic_drawable_selector"
  31. android:gravity="center"
  32. android:text="话题"
  33. style="@style/bottom_tag_style"
  34. />
  35.  
  36. <RadioButton
  37. android:id="@+id/rb_find"
  38. android:drawableTop="@drawable/rb_find_drawable_selector"
  39. android:gravity="center"
  40. android:text="发现"
  41. style="@style/bottom_tag_style"
  42. />
  43.  
  44. <RadioButton
  45. android:id="@+id/rb_my"
  46. android:drawableTop="@drawable/rb_my_drawable_selector"
  47. android:gravity="center"
  48. android:text="我的"
  49. style="@style/bottom_tag_style"
  50. />
  51.  
  52. </RadioGroup>
  53.  
  54. </LinearLayout>

3、style.xm中的bottom_tag_style是公共的button属性

  1. <resources>
  2.  
  3. <!-- Base application theme. -->
  4. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  5. <!-- Customize your theme here. -->
  6. <item name="colorPrimary">@color/colorPrimary</item>
  7. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  8. <item name="colorAccent">@color/colorAccent</item>
  9. </style>
  10.  
  11. <style name="bottom_tag_style" >
  12. <!-- Customize your theme here. -->
  13. <item name="android:layout_width">wrap_content</item>
  14. <item name="android:layout_height">wrap_content</item>
  15. <item name="android:layout_gravity">center_vertical</item>
  16.  
  17. <item name="android:button">@null</item>
  18. <item name="android:drawablePadding">5dp</item>
  19. <item name="android:textColor">@drawable/bottom_textcolor_drawable_selector</item>
  20.  
  21. <item name="android:textSize">14sp</item>
  22. <item name="android:layout_weight">1</item>
  23. </style>
  24. </resources>

4、NoScrollViewPager在布局文件中使用该类的时候,实例化该类用该构造方法,这个方法不能少,少的化会崩溃。

  1. package com.vitoyan.myangtzeu.view;
  2.  
  3. import android.content.Context;
  4. import android.support.v4.view.ViewPager;
  5. import android.util.AttributeSet;
  6. import android.view.MotionEvent;
  7.  
  8. /**
  9. * 作者:Vito-Yan
  10. * 作用:自定义不可以滑动的ViewPager
  11. */
  12. public class NoScrollViewPager extends ViewPager {
  13. /**
  14. * 通常在代码中实例化的时候用该方法
  15. * @param context
  16. */
  17. public NoScrollViewPager(Context context) {
  18. super(context);
  19. }
  20.  
  21. /**
  22. * 在布局文件中使用该类的时候,实例化该类用该构造方法,这个方法不能少,少的化会崩溃。
  23. * @param context
  24. * @param attrs
  25. */
  26. public NoScrollViewPager(Context context, AttributeSet attrs) {
  27. super(context, attrs);
  28. }
  29.  
  30. /**
  31. * 重写触摸事件,消费掉
  32. * @param ev
  33. * @return
  34. */
  35. @Override
  36. public boolean onTouchEvent(MotionEvent ev) {
  37. return true;
  38. }
  39.  
  40. @Override
  41. public boolean onInterceptTouchEvent(MotionEvent ev) {
  42. return false;
  43. }
  44. }

5、解决底部按钮与android虚拟按键的冲突,在activity的onCreate方法中加入以下代码,可以屏蔽虚拟按键

  1. getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
  2. | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN);

具体的源代码可以在我的github上查看https://github.com/Vito-Yan/MYangtzeu

下面我们使用xutils来初始化控件,xutils3可以操作数据库,联网请求,初始化控件,加载图片。。。。

可以在github下载最新的xutils3,下载之后引入,修改build版本,关联库到app,在此不加赘述。

使用方法:在这里使用注解关联视图比以前更方便,之后也会用到xutils联网请求数据。

  1. package com.vitoyan.myangtzeu.fragment;
  2.  
  3. import android.view.View;
  4. import android.widget.RadioGroup;
  5.  
  6. import com.vitoyan.myangtzeu.R;
  7. import com.vitoyan.myangtzeu.base.BaseFragment;
  8. import com.vitoyan.myangtzeu.utils.LogUtil;
  9. import com.vitoyan.myangtzeu.view.NoScrollViewPager;
  10.  
  11. import org.xutils.view.annotation.ViewInject;
  12. import org.xutils.x;
  13.  
  14. /**
  15. * 作者:Vito-Yan
  16. * 作用:正文Fragment
  17. */
  18. public class ContentFragment extends BaseFragment {
  19.  
  20. //2.初始化控件
  21. @ViewInject(R.id.viewpager)
  22. private NoScrollViewPager viewpager;
  23.  
  24. @ViewInject(R.id.rg_main)
  25. private RadioGroup rg_main;
  26.  
  27. @Override
  28. public View initView() {
  29. LogUtil.e("正文视图被初始化了");
  30. View view = View.inflate(context, R.layout.content_fragment,null);
  31. // viewpager = view.findViewById(R.id.viewpager);
  32. // rg_main = view.findViewById(R.id.rg_main);
  33. //1.把视图注入到框架中,让ContentFragment.this和View关联起来
  34. x.view().inject(ContentFragment.this,view);
  35. return view;
  36. }
  37.  
  38. @Override
  39. public void initData() {
  40. super.initData();
  41. LogUtil.e("正文数据被初始化了");
  42.  
  43. //设置默认选中首页
  44. rg_main.check(R.id.rb_home);
  45. }
  46.  
  47. }

我的长大app开发教程第二弹:完成ContentFragment底部按钮的更多相关文章

  1. 我的长大app开发教程第一弹:Fragment布局

    在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...

  2. 我的长大app开发教程第三弹:实现四个子页面绑定RadioButton

    在开始之前先上一张图 在上一节中我们实现了底部Button,这一弹我们要实现点击四个按钮分别切换到不同页面,我们可以把页面分为两部分,顶部栏和中间内容部分,我们可以通过线性布局包裹两部分内容,顶部栏又 ...

  3. EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念

    目录 1. 使用Anypoint Studio开发 2. Mule ESB Application Structure - Mule ESB应用程序结构 3. Mule ESB Application ...

  4. linux下开发c++第二弹--helloworld与makefile

    一:hello world sudo vim hello.cpp 输入  g++ -o hello hello.cpp  获得hello 输入  ./hello 运行,显示结果hello world! ...

  5. DuiVision开发教程(18)-弹出窗

    DuiVision的弹出窗体类CDlgPopup,是菜单.下拉列表等控件的父类,也能够单独使用,用于创建弹出窗体.弹出窗体默认是非激活状态下自己主动关闭,比如鼠标点击到弹出窗体外面的区域,弹出窗体就会 ...

  6. Delphi XE8 iOS与Android移动应用开发(APP开发)教程[完整中文版]

    https://item.taobao.com/item.htm?id=536584650957&toSite=main

  7. EnjoyingSoft之Mule ESB开发教程第一篇:初识Mule ESB

    目录 1. Mule ESB基本介绍 2. Mule ESB社区版和企业版 3. Mule ESB常用场景 4. Mule ESB软件安装 客户端安装 服务端安装 5. 第一个Mule ESB应用- ...

  8. EnjoyingSoft之Mule ESB开发教程系列第五篇:控制消息的流向-数据路由

    目录 1. 使用场景 2. 基于消息头的路由 2.1 使用JSON提交订单的消息 2.2 使用XML提交订单的消息 2.3 使用Choice组件判断订单格式 3. 基于消息内容的路由 4. 其他控制流 ...

  9. EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式

    目录 1. MEL的优势 2. MEL的使用场景 3. MEL的示例 4. MEL的上下文对象 5. MEL的Variable 6. MEL访问属性 7. MEL操作符 本篇主要介绍Mule表达式语言 ...

随机推荐

  1. Coding and Paper Letter(五十八)

    资源整理. 1 Coding: 1.支持TMS.WMTS标准瓦片下载,支持百度地图瓦片.高德地图瓦片.腾讯地图瓦片.天地图.ArcServer Rest瓦片.ArcServer本地缓存切片.geose ...

  2. 【BZOJ1831】[AHOI2008]逆序对(动态规划)

    [BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\) ...

  3. 【WC2018】州区划分(FWT,动态规划)

    [WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...

  4. [JSOI2008]魔兽地图(树形dp)

    DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allst ...

  5. Spring Data JPA Batch Insertion

    转自:https://www.jeejava.com/spring-data-jpa-batch-insertion/ Spring Data JPA Batch Insertion will sho ...

  6. SpringBoot整合阿里Druid数据源及Spring-Data-Jpa

    SpringBoot整合阿里Druid数据源及Spring-Data-Jpa https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=224 ...

  7. js jquery 判断元素是否在数组内

    js jquery 判断元素是否在数组内 一,js方法 var arr = ["a", "b", "c"]; // js arr.index ...

  8. Arcgis for qml - 鼠标拖拽移动

    以实现鼠标拖拽文本图层为例 GitHub:ArcGIS拖拽文本 作者:狐狸家的鱼 目的是利用鼠标进行拖拽. 实现两种模式,一种是屏幕上的拖拽,第二种是地图上图层的挪动. 屏幕上的拖拽其实跟ArcGIS ...

  9. A1123. Is It a Complete AVL Tree

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  10. 爬虫 写入文件时遇到gbk编码错误

    #获取视频地址 # 每次请求一次,然后写文件,这样可以规避多次请求触发反爬虫 r = requests.get('https://www.pearvideo.com/video_1522192') h ...