第一行代码(三)

第三章内容主讲UI,View控件和ViewGroup布局

一、View的一些琐碎知识:

  Button中的所有英文字母自动进行大写转换,如果要禁用这一默认特性,属性:android:textAllCaps="false"
  ProgressBar通过style属性可以改变其样式,比如:
style="?android:attr/progressBarStyleHorizontal"
  AlertDialog的构建方式:通过AlertDialog.Builder创建一个AlertDialog实例


image.png

  ProgressDialog和AlertDialog有些类似,只不过ProgressDialog会在对话框中显示一个进度条,注意,如果在setCancelable(boolean)方法中传入了false,就表示ProgressDialog是不能通过返回键取消掉的。


image.png

二、四大布局中的百分比布局:

  除了LinearLayout以外,其他两种布局都不支持按比例指定控件大小,所以出现了百分比布局,可以不使用wrap_content和match_parent来指定控件的大小,而直接指定控件在布局中所占的百分比,轻松实现平分布局甚至是任意比例分割布局。
  PercenntFrameLayout和PercentRelativeLayout这两个全新的布局,放在了support库当中,需要添加依赖。
compile 'com.android.support:percent:26.+'

注意:如果使用百分比布局,要写全包名,还必须定义一个app的命名空间,才能使用百分比布局的属性:使用
  app:layout_widthPercent和app:layout_heightPercent来指定布局所占的百分比。

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:text="button1"
        app:layout_heightPercent="50%"
        app:layout_widthPercent="50%" />

    <Button
        android:text="button2"
        android:layout_alignParentRight="true"
        app:layout_heightPercent="50%"
        app:layout_widthPercent="50%" />

    <Button
        android:text="button3"
        android:layout_alignParentBottom="true"
        app:layout_heightPercent="50%"
        app:layout_widthPercent="50%" />
    
    <Button 
        android:text="button4"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        app:layout_heightPercent="50%"
        app:layout_widthPercent="50%"/>

</android.support.percent.PercentRelativeLayout>
image.png

三、简单的自定义View相关内容:

  首先,所有控件都是直接或者间接继承自View的,所有布局都是直接或间接继承自ViewGroup的。

View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域内的各种事件,ViewGroup是一种特殊的View,包含了很多子View和子ViewGroup.
填充布局使用LayoutInflater的from()方法构建出一个LayoutInflater对象,然后调用inflate()方法就可以动态加载一个布局文件,inflate()方法接收两个参数,第一个参数是要加载的布局文件的id,第二个参数是给加载好的布局再添加一个父布局。

四、ListView:

这里inflate()方法接受三个参数,前两个已经知道了什么意思,第三个参数是boolean值,如果是false,表示只让我们在父布局中声明的layout的属性生效,但不为这个View添加父布局。
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
我们仔细看这个方法,下面分两种情况:

  1.root为null:
    不管你attachToRoot为何值,效果都是一样的,root为null表示不需要将resource的布局添加到任何容器中,所以resource布局中根节点的layout属性不会生效,同时需要我们手动调用addView()方法添加布局
  2.root不为null:
    如果attachToRoot=true,表示将resource布局添加到root中,添加过程中resource所指定的布局的根节点的属性都是有效的,而且不需要写addView()就能将布局添加进来(如果写了addView()会报错);
    如果attachToRoot=false,表示不将resource指定的布局添加到root中,为何会这样写,以为layout_width和layout_height表示一个控件在容器中的大小,必须在容器中才有意义。所以如果我想让resource指定的布局的根节点有效,但是又不想为其添加父布局,那么就是这样写了。这是ListView的标准写法。

ListView提升效率:

  在Adapter的getView()方法中有一个covertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用。


image.png

  新增一个内部类ViewHolder,用于对控件的实例进行缓存,当convertView为null的时候,创建一个ViewHolder对象,并将控件放在ViewHolder里,然后调用View的setTag()方法,然后将ViewHolder对象存储在View中。当convertView不为null的时候,则调用View的getTag()方法,把ViewHolder重新取出。这样所有控件的实例都缓存在了ViewHolder中,就没必要每次都通过fidnViewById()来获取了。


image.png

五、RecyclerView:

  RecyclerView定义在了support库当中,需要添加依赖


image.png

  然后需要为RecyclerView准备适配器,该适配器继承自RecyclerView.Adapter,并指定泛型为xxxAdapter.ViewHolder,这个ViewHolder是我们在XXXAdapter中定义的一个内部类。


image.png

image.png
横向滚动布局

  很简单,只需要改动一行代码(可能需要改动item布局):


image.png
瀑布流

  ListView的布局排列是由自身去管理的,而RecyclerView是交给了LayoutManager,LayoutManager中制定了一套可扩展的布局排列接口,子类只要按照接口的规范来实现,就能定制出不同的排列方式的布局了。
  除了LinearLayoutManager之外,RecyclerView还提供了GridLayoutManager和StaggeredGridLayoutManager这两种内置的布局排列方式。GridLayoutManager用于实现网格布局,StaggeredGridLayoutMannager用于实现瀑布流布局。
  我们只需要创建StaggeredGridLayoutManager的实例,它的构造方法接收两个参数,第一个参数用于指定布局的列数,第二个参数用于指定布局的排列方向。

RecyclerView的点击事件

  在onCreateViewHolder()方法中注册点击事件就可以了,我们可以通过holder.getAdapterPosition();来获取点击的是哪一个item

小技巧:

  制作Nine-Patch图片,在Android sdk目录下有一个tools文件夹,在该文件夹下找到draw9patch.bat文件,我们要使用它来制作Nine-Patch图片,如果要打开这个文件,必须要将JDK的bin目录配置到环境变量当中才行。双击打开draw9patch.bat文件,在导航栏点击File-->Open 9-patch将png文件加载进来。在图片的四个边框绘制一个个的小黑点,上、左部分表示需要拉伸时就拉伸黑点标记的区域,下、右表示内容放置的区域,按住shift拖动可以进行擦除。最后点击导航栏File-->Save 9-patch把绘制好的图片进行保存
  RecyclerView添加数据:给adapter的数据源List添加了一个数据后,要调用adapter.notifyItemInserted(data.size() - 1);这样会刷新列表的显示,然后可以调用recyclerView.scrollToPosition(data.size()-1);让RecyclerView定位到最后一行

下一篇文章 https://www.jianshu.com/p/a27cac987340

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容