《一个Android工程的从零开始》-2、base(一) BaseActivity布局

来源:互联网 发布:大数据相关的技术 编辑:程序博客网 时间:2024/06/13 17:25

《一个Android工程的从零开始》-2、base(一)

先扯两句

开篇自然还是老规矩,我先扯两句,上一篇博客发出去之后,我的博客阅读量终于到一位数了(此处应该有掌声)!虽然没有人评论与我互动,但是这是不是代表看过的都认为我说的完全正确呢,如此一想,更是有些小激动呢,于是快马加鞭开始些新一篇博客。
闲言少叙,上正文!

正文

请无视上面这个无脑到极致的标题。。。
上一篇已经说过了目录结构的部分,其中有一个本应该在UI包中的包,却被我单独拿到外面来了,如果看过前一篇的一定会知道,那就是base包,而这个包的功能就像它名字一样——基础。在官方的说法中,应该如何运用这些内容,我还真没查到,但是就我个人的理解,其实base很简单,那就是放上一些常用的,没有或者少有约束的常量、变量以及类(包括内部类等等)。
另外,我把自己的工程上传到了码云上,每次发博客会随着一起将对应的自愿上传,有需要的朋友可以去看看,一切都刚开始,希望大家多支持。
https://git.oschina.net/bsw_lm/MyBaseApplication
好了,多说无益,还是直接上干货吧!!!

BaseActivity

首先第一步自然就是创建一个Activity了,这个自然不用说了。至于创建的步骤,想必大多数人都不需要我多说,如果不清楚如何操作的话,自行往下翻,在附录1中有说明。
创建好了BaseActivity,可以看到多了两个文件,分别为BaseActivity.java和activity_base.xml,作为一个懒人,自然选择简单的部分先做,那就先从.xml文件开始喽。

activity_base.xml

先上一段代码

<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" tools:context="com.mybaseapplication.base.BaseActivity">    <android.support.constraint.ConstraintLayout        android:layout_width="match_parent"        android:layout_height="match_parent">    </android.support.constraint.ConstraintLayout></ScrollView>

(元素不理解的,可以参见附录2)
大家或许能看出来,这部分代码与大家所创建出来的,不完全一样,或者对于部分人来说是完完全全的不一样。
首先说先说说自己修改的部分,那就是将最外层的布局换成了ScrollView,或许有些人对于ScrollView并不太熟悉,那么ListView、GridView想必大家都是熟悉的吧,想必大家已经猜到了,没错,他们之间的关系就是——没关系!
哈哈哈,先不要生气,其实也不能说完全没有关系,他们都是能滑动的控件,之所以说ListView、GridView,是因为大家比较了解,当item过多,一个页面无法完全显示的时候,他们会做一些处理,当用户滑动界面的时候,就会将来不及显示的部分呈现在用户的眼前。
而ScrollView的作用也是如此,只是他不需要用适配器,只要将需要滑动处理的布局放到ScrollView内,当超出屏幕显示范围的时候,自然就可以滑动了。
当然,ScrollView也不是完全没有限制的,那就是在ScrollView中,只能存在一个直接子控件,也就是它只能有一个儿子,这就对我们的布局产生了很大的限制,不过还好,虽然这货自己禁欲,却没有这么要求他儿子,也就是说他可以拥有大量的孙子。所以一般情况下,我们都会在其中放置布局控件(RelativeLayout、LinearLayout以及我放置的ConstraintLayout等等,其他自然也有,只是个人不太常用罢了),然后再将其他控件放置在该布局内。
这么做的原因是什么呢?主要还是由于android开发最大的一个痛点,那就是手机适配,毕竟android不是苹果,出一个版本都长一个样,而android,同一个版本的手机也能长得千奇百怪,再加上手机厂商不同,各种分辨率不统一之类的问题多如牛毛。
虽然说如今多数智能机是5.0以上,但是谁也不能保证用户中没有几个特立独行的存在,当我们开发的时候,为了大多数手机上,布局显示的美观一些,自然这些“非主流”机型就无法完全照顾到,但是至少我们还是要做到让其布局显示完整吧。
(当然,如果贵公司决定放弃这些机型,ScrollView可以去掉,在对应需要的页面再添加上即可)。
至于ConstraintLayout布局,想必知道的人就要更少一些了,很遗憾,对于这个布局,我也无能为力,无法给出附录内容解释,最多给大家提供一个郭霖郭神的博客链接,如果哪位大神研究有所成,跪求指点。

该扯的都扯差不多了,终于可以小代码了,真心有点小兴奋,毕竟曾经一次面试,我可是给HR吹牛B说,自己就是为了写代码而生的!
不过代码之前,容我最后BB几句,大家先看图
这里写图片描述
(这图,真丑)
这一般就是如今Android APP比较常见的页面布局,也是今天要完成的部分,我都想骂自己一句,BB这么长时间就弄这点东西,对此,我也很无奈啊。
既然明确目标了,那么我们就来分析一下,这个布局都需要什么控件,首先title自然是TextView,然后就是三个按键,大家也看得出来是ImageView,不过还有一点就是最右侧的可能会是文字,所以可能我们还需要一个TextView,下面最大面积的部分我们下一篇会解释是做什么的,以及怎么用,这里就先留个悬念。所以总结一下,就是两个TextView,三个ImageView。
而之间的关系也显而易见,那就是title在中间,最左侧是返回图片,只是右侧有些不同,可能会是几种情况:

  • 都不显示:那还管他去死
  • 显示最右侧的图片/文字:做法与返回基本相同
  • 两个图片都显示(很少见到图片+文字的显示形式,如果你遇到了,恭喜):那么则需要注意一下位置关系

下面我就分三种情况做这个布局,分别使用LinearLayout、RelativeLayout、以及那个我也刚刚才开始学习的ConstraintLayout,集中布局的知识点我就不细说了,有兴趣的还是老规矩,自行百度。

  1. LinearLayout
<LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <LinearLayout            android:layout_width="match_parent"            android:background="@color/colorPrimary"            android:orientation="horizontal"            android:layout_height="50dp">            <ImageView                android:layout_width="50dp"                android:layout_height="50dp"                android:padding="@dimen/size_13"                android:tint="@android:color/white"                android:src="@mipmap/back"/>            <TextView                android:layout_width="0dip"                android:layout_height="match_parent"                android:layout_weight="1"                android:textColor="@android:color/white"                android:gravity="center"                android:textSize="@dimen/size_20"                android:text="@string/title"/>            <ImageView                android:layout_width="50dp"                android:layout_height="50dp"                android:padding="@dimen/size_13"                android:tint="@android:color/white"                android:src="@mipmap/add"/>            <ImageView                android:layout_width="50dp"                android:layout_height="50dp"                android:padding="@dimen/size_13"                android:tint="@android:color/white"                android:src="@mipmap/more"/>            <TextView                android:layout_width="50dp"                android:layout_height="50dp"                android:textColor="@android:color/white"                android:gravity="center"                android:textSize="@dimen/size_17"                android:visibility="gone"                android:text="@string/make_sure"/>        </LinearLayout>    </LinearLayout>

以上就是纯LinearLayout的布局,大家可以看得出来其中我又很不懂事的换了个不常见的东西,那就是mipmap,这部分大家可以看一下下面评论区大神的评论,说是官方建议在mipmap中只放置启动图标,这部分我也查了一下网上的说法,可谓是众说纷纭,作为一个android小菜鸟也实在不知道应该怎么取舍才好,现在我个人在工程中是xml文件、.9图片是放在drawable中,其他的小图片放置在mipmap中,这里我就不多加建议了,大家自行理解一下吧,也欢迎大家多指点
这里写图片描述

再看隐藏掉一张图的

这里写图片描述

看一下显示文字的

这里写图片描述

最后一张,右侧都不显示的

这里写图片描述

显而易见的是,中间的标题位置好像出了点问题,这完全是因为我设定的是文字居中,标题的宽度权重设了1。很郁闷的是,在Linearlayout的布局中,有一些限制,不让控件居中显示,具体的参见附录3。
不过虽然有这个问题,但是可以看得出来,纯LinearLayout的代码量是很少的。
2. RelativeLayout

<RelativeLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <RelativeLayout            android:layout_width="match_parent"            android:background="@color/colorPrimary"            android:layout_height="50dp">            <ImageView                android:layout_width="50dp"                android:layout_height="50dp"                android:padding="@dimen/size_13"                android:src="@mipmap/back"                android:tint="@android:color/white" />            <TextView                android:layout_width="wrap_content"                android:layout_height="match_parent"                android:layout_centerInParent="true"                android:gravity="center"                android:text="@string/title"                android:textColor="@android:color/white"                android:textSize="@dimen/size_20" />            <ImageView                android:layout_width="50dp"                android:layout_height="50dp"                android:padding="@dimen/size_13"                android:src="@mipmap/add"                android:layout_toLeftOf="@+id/right_icon1"                android:tint="@android:color/white" />            <ImageView                android:id="@+id/right_icon1"                android:layout_width="50dp"                android:layout_height="50dp"                android:padding="@dimen/size_13"                android:src="@mipmap/more"                android:layout_alignParentRight="true"                android:tint="@android:color/white"/>            <TextView                android:layout_width="50dp"                android:layout_height="50dp"                android:gravity="center"                android:text="@string/make_sure"                android:textColor="@android:color/white"                android:layout_alignParentRight="true"                android:textSize="@dimen/size_17"                android:visibility="gone" />        </RelativeLayout>    </RelativeLayout>

这次就直接上效果图了:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

很显然,这个是解决了标题布局的问题,但是可以看一下代码中要明显比之LinearLayout复杂了一些,而多出来的这部分就是处理位置关系的代码。
3. ConstraintLayout

<android.support.constraint.ConstraintLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <TextView            android:id="@+id/textView"            android:layout_width="0dp"            android:layout_height="50dp"            android:layout_marginTop="0dp"            android:background="@color/colorPrimary"            android:gravity="center"            android:text="@string/title"            android:textColor="@android:color/white"            android:textSize="@dimen/size_20"            app:layout_constraintBottom_toBottomOf="parent"            app:layout_constraintHorizontal_bias="0.0"            app:layout_constraintLeft_toLeftOf="parent"            app:layout_constraintRight_toRightOf="parent"            app:layout_constraintTop_toTopOf="parent"            app:layout_constraintVertical_bias="0.0" />        <ImageView            android:id="@+id/imageView3"            android:layout_width="50dp"            android:layout_height="50dp"            android:padding="@dimen/size_13"            android:src="@mipmap/back"            android:tint="@android:color/white" />        <ImageView            android:id="@+id/imageView2"            android:layout_width="50dp"            android:layout_height="50dp"            android:padding="@dimen/size_13"            android:src="@mipmap/add"            android:tint="@android:color/white"            app:layout_constraintRight_toLeftOf="@+id/imageView" />        <ImageView            android:id="@+id/imageView"            android:layout_width="50dp"            android:layout_height="50dp"            android:padding="@dimen/size_13"            android:src="@mipmap/more"            android:tint="@android:color/white"            app:layout_constraintRight_toRightOf="@+id/textView2" />        <TextView            android:id="@+id/textView2"            android:layout_width="50dp"            android:layout_height="50dp"            android:gravity="center"            android:text="@string/make_sure"            android:textColor="@android:color/white"            android:textSize="@dimen/size_17"            android:visibility="gone"            app:layout_constraintRight_toRightOf="@+id/textView" />    </android.support.constraint.ConstraintLayout>

不知道大家看到这些代码是什么感受,反正我是想打人,还好这些代码不需要我写,不然我分分钟哭给AS看!具体是怎么完成 ,研究一下ConstraintLayout就会知道,so easy!当然,直接粘贴到Layout文件还是能用的,如果是自己布局的话,其中会有这么一行代码

tools:layout_editor_absoluteY="0dp"

记得一定要把它删掉,不然会出现警告“The layout editor allows you to place widgets anywhere on the canvas, and it records the current position with designtime attributes (such as layout_editor_absoluteX.) These attributes are not applied at runtime, so if you push your layout on a device, the widgets may appear in a different location than shown in the editor. To fix this, make sure a widget has both horizontal and vertical constraints by dragging from the edge connections.”就我的英文水平,理解的意思就是那行代码没用,留着运行时也不显示,所以我就删了。具体原因附录2中有说明,没看到的可以去看一下。

总结

上面的这三种布局显示没有说谁好谁坏的意思,所以不要认为LinearLayout就如何不受控制,RelativeLayout就如何的麻烦,而且在ConstraintLayout出现之前,大多数布局还是依靠LinearLayout与RelativeLayout的配合去完成的,所以控件没有好坏,只看你使用的时机罢了。
后面的博客的xml部分呢,我都会分成两部分去写,一个是LinearLayout与RelativeLayout配合的,一部分是ConstraintLayout的,过程中如果有什么问题,希望大家多指点批评。
上述代码中用到的属性,在附录4中,会有简单的说明(ConstraintLayout除外),其中个人感觉需要注意的点,字体做了加粗处理。

附录

附录1:
当然,你可以直接创建一个class继承AppCompatActivity,在创建一个layout xml文件,不过对于我这种懒人,还是感觉这个太麻烦
这里写图片描述

所以如图所示,右击你所要创建Activity的包,然后new–>Acitivity–>Empty Activity。

这里写图片描述

将1处的Activity Name修改为BaseActivity即可,2所对应的Layout Name会随着自动修改,至于包名,如果你是在base包创建的,如同上面截图一样,就不用修改了,如果不是你想使用的包,那么修改一下即可,最后点击finish即可完成Activity的创建。

附录2:

<?xml version="1.0" encoding="utf-8"?>

每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,xml version=”1.0”的含义是这一行代码会告诉解析器和浏览器,这个文件应该按照1.0版本的XML规则进行解析。
encoding = “utf-8”表示此xml文件采用utf-8的编码格式。

xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"

首先说明xmlns意思为“xml namespace”。冒号后面是给这个引用起的别名。
至于用法,这个格式的意思,就是将我们预设的一些在应用程序包中的属性,赋给前面的前缀,有点C中#define的意思,再官方的说法,大家自行百度一下,可以看到有很多的内容,而且基本都是一个祖宗生出来的,我就不多BB了,就把我自己的理解跟大家说一下吧。
xmlns:前缀=http://schemas.android.com/apk/res/你的应用程序包路径。类比“老师说:A=B。”
所以当我们在后面代码这种使用的时候,B的孩子,就可以说是A的孩子,至于为什么,别问我,我也不需要知道,反正老师说的!
这样是不是就清晰多了,以后遇到就这么用,反正这个锅有老师背着。
下面再说一下这三个货分别是什么意思:

  1. “android”:这个就理解成官方定义的东西,比如老师告诉我width是宽,我就当你width是宽,老子可没时间去研究他是英文翻译过来的,更没心情去考虑,那么多英文为毛值用这个词,我只管拿来用就好;
  2. “app”:这个就是我们自己定义的东西,比如你说width是宽,我改不了,可是我说my_width是颜色,你只能给我设置颜色的参数,别跟我说这单词翻译过来不是这个意思之类的,用周杰伦的歌词说,“在我地盘这,你就得听我的”(当然,这部分是戏言,我们在自己定义属性的时候,叛逆也可以,但是一定要使用自己能看懂的,不然自己都晕菜了,还怎么写代码赚资本家的钱)。
  3. “tools”:这部分是最没用的东西,具体怎么个没用,我是实在懒得说了,大家可以参考一下zhengdan66的博客,里面有详细的说明。

附录3:
当 android:orientation=”vertical” 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。即:left,right,center_horizontal 是生效的。
当 android:orientation=”horizontal” 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。即:top,bottom,center_vertical 是生效的。

附录4:

  1. android:layout_width:设置控件宽度
  2. android:layout_height:设置控件高度
  3. android:background:设置控件背景色
  4. android:visibility:设置控件是否可见(visibility可见、invisibility不可见、gone隐藏。invisibility与gone的区别就是,invisibility会保留控件所占空间,而gone则不会保留控件所占控件,就我开发至今,还是gone使用的多一些)
  5. android:gravity:设置控件内部的控件或者文本的位置(ImageView无法使用这个属性)
  6. android:layout_gravity:设置控件相对于父控件的位置(LinearLayout会存在受限,参见附录3)
  7. android:src:设置ImageView图片资源
  8. android:tint:设置ImageView图片纯色(可以任意设定,比如我的就是蓝色的图,但是设置白色后显示的就是白色的图片)
  9. android:text:设置文本
  10. android:textColor:设置文本颜色
  11. android:textSize:设置文本字体大小
  12. android:id:设置控件的id,类比身份证号,能找到唯一 指定的控件,对其进行操作,可以在xml相对布局中使用,也可在代码中使用其找到对应控件,用于操作
  13. android:layout_toLeftOf:在RelativeLayout布局内的直接子控件可以使用的属性,紧邻某控件的左侧,参数是id
  14. android:orientation:LinearLayout的属性,当LinearLayout中的控件超过一个的时候,必须要设置,有两个参数horizontal(横向布局)和vertical(纵向布局)
  15. layout_weight:权重,在RelativeLayout布局内的直接子控件可以使用的属性,当android:orientation=”horizontal”时,使用权重的控件android:layout_width属性必须设置为0dip(也就是0dp),反之当android:orientation=”vertical”时,android:layout_height属性必须设置为0dip

附录5:
《一个Android工程的从零开始》目录

阅读全文
1 0