前言

最近看到一本书,是开发安卓的一些小技巧和基础知识,大家一起查漏补缺吧!只有一部分,其他的有点老了,还有一些不感兴趣,没继续看了,所以只有9个知识点哦

1. 使用weight和weightsum属性实现视图居中

......

android:gravity="center"

android:orientation="horizontal"

android:weightSum="1" > //

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="0.5" //确保按钮占据50%空间

......

/>

2. 在include里使用android:layout_*属性,重写include布局属性,实现复用

footer布局:

android:layout_width="0dp"

android:layout_height="0dp"

android:gravity="center"

android:text="@string/footer_text" />

include footer:

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_marginBottom="30dp"

layout="@layout/footer" />

......

/RelativeLayout>

3. ViewStub实现view的延迟加载

场景:让用户自己决定是否显示地图信息

地图view

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:clickable="true"

......

/>

使用ViewStub

android:id="@+id/map_stub"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:inflatedId="@+id/map_view"

android:layout="@layout/map" />

在Activity中调用

private View mViewStub;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mViewStub = findViewById(R.id.map_stub);

}

public void onShowMap(View v) {

mViewStub.setVisibility(View.VISIBLE);

}

......

inflatedId是调用ViewStub的inflate()方法或setVisibility()方法是返回的ID,这个ID便是被填充的View的ID,避免了使用findViewById()方法

4.定制ViewGroup

绘制布局由两个遍历过程组成:测量过程和布局过程。测量过程由measure(int, int)方法完成,该方法从上到下遍历视图树。在递归遍历过程中,每个视图都会向下层传递尺寸和规格。当measure方法遍历结束,每个视图都保存了各自的尺寸信息。第二个过程由layout(int,int,int,int)方法完成,该方法也是由上而下遍历视图树,在遍历过程中,每个父视图通过测量过程的结果定位所有子视图的位置信息。

为了理解这个概念,下面分析ViewGroup的绘制过程,第一步是测量ViewGroup的宽度和高度,在onMeasure方法中完成这个步骤。在该方法中,ViewGroup通过遍历所有子视图计算它的大小。最后一步操作,在onLayout()方法中完成,利用上一步计算出的测量信息,布局所有子视图。

作者实现了如下布局:

1>在values下创建attrs.xml,自定义属性

//属性名前缀是layout_,因此该属性会被添加到LayoutParams的属性表中

2>布局

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

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

android:layout_width="fill_parent"

android:layout_height="fill_parent"

anyname:horizontal_spacing="30dp"

anyname:vertical_spacing="20dp" >

android:layout_width="100dp"

android:layout_height="150dp"

anyname:layout_vertical_spacing="90dp"

android:background="#FF0000" />

android:layout_width="100dp"

android:layout_height="150dp"

android:background="#00FF00" />

android:layout_width="100dp"

android:layout_height="150dp"

android:background="#0000FF" />

3>自定义CascadeLayout

public class CascadeLayout extends ViewGroup {

private int mHorizontalSpacing;

private int mVerticalSpacing;

public CascadeLayout(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs,

R.styleable.CascadeLayout);

try {

mHorizontalSpacing = a.getDimensionPixelSize(

R.styleable.CascadeLayout_horizontal_spacing,

getResources().getDimensionPixelSize(

R.dimen.cascade_horizontal_spacing));

mVerticalSpacing = a.getDimensionPixelSize(

R.styleable.CascadeLayout_vertical_spacing, getResources()

.getDimensionPixelSize(R.dimen.cascade_vertical_spacing));

} finally {

a.recycle();

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// 使用宽和高计算布局的最终大小以及子视图的x和y轴位置

int width = getPaddingLeft();

int height = getPaddingTop();

int verticalSpacing;

final int count = getChildCount();

for (int i = 0; i < count; i++) {

verticalSpacing = mVerticalSpacing;

View child = getChildAt(i);

measureChild(child, widthMeasureSpec, heightMeasureSpec); //令每个子视图测量自身

LayoutParams lp = (LayoutParams) child.getLayoutParams();

width = getPaddingLeft() + mHorizontalSpacing * i;

// 在LayoutParams中保存每个子视图的x、y坐标

lp.x = width;

lp.y = height;

if (lp.verticalSpacing >= 0) {

verticalSpacing = lp.verticalSpacing;

}

width += child.getMeasuredWidth();

height += verticalSpacing;

}

width += getPaddingRight();

height += getChildAt(getChildCount() - 1).getMeasuredHeight()

+ getPaddingBottom();

setMeasuredDimension(resolveSize(width, widthMeasureSpec),

resolveSize(height, heightMeasureSpec)); // 用计算所得宽高设置整个布局的测量尺寸

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

final int count = getChildCount();

for (int i = 0; i < count; i++) {

View child = getChildAt(i);

LayoutParams lp = (LayoutParams) child.getLayoutParams();

child.layout(lp.x, lp.y, lp.x + child.getMeasuredWidth(), lp.y

+ child.getMeasuredHeight());

}

}

@Override

protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {

return p instanceof LayoutParams;

}

@Override

protected LayoutParams generateDefaultLayoutParams() {

return new LayoutParams(LayoutParams.WRAP_CONTENT,

LayoutParams.WRAP_CONTENT);

}

@Override

public LayoutParams generateLayoutParams(AttributeSet attrs) {

return new LayoutParams(getContext(), attrs);

}

@Override

protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {

return new LayoutParams(p.width, p.height);

}

public static class LayoutParams extends ViewGroup.LayoutParams {

int x;

int y;

public int verticalSpacing;

public LayoutParams(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs,

R.styleable.CascadeLayout_LayoutParams);

try {

verticalSpacing = a

.getDimensionPixelSize(

R.styleable.CascadeLayout_LayoutParams_layout_vertical_spacing,

-1);

} finally {

a.recycle();

}

}

public LayoutParams(int w, int h) {

super(w, h);

}

}

}

5. TextSwitcher和ImageSwitcher实现平滑过渡

TextSwitcher: 为文本标签添加动画效果

ImageSwitcher : 为图片切换添加动画效果

mTextSwitcher.setFactory(new ViewFactory() {

@Override

public View makeView() {

TextView t = new TextView(MainActivity.this);

t.setGravity(Gravity.CENTER);

return t;

}

});

mTextSwitcher.setInAnimation(this, android.R.anim.fade_in);

mTextSwitcher.setOutAnimation(this, android.R.anim.fade_out);

mTextSwitcher.setText("hello");

6. 避免在Edittext中验证日期

在应用程序中使用Android内置资源是一个借用设备样式的好方法,如

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="@android:drawable/edit_text"

/>

7. 格式化TextView的文本,如链接、不同样式文本等

链接:

textView1.setText(Html.fromHtml("Manning home page]]>"));

textView1.setMovementMethod(LinkMovementMethod.getInstance());

不同样式

final Spannable text2 = new SpannableString(

getString(R.string.text2));

text2.setSpan(new BackgroundColorSpan(Color.RED), 1, 4, 0);

text2.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 9, 0);

XX.setText(text2);

8. 横竖屏

设置android:configChanges="orientation"就不会重启Activity,而是调用onConfigurationChanged()方法

9. 移除窗口默认背景提高应用程序启动速度

@null

true

9.更改toast显示位置

Toast toast = Toast.makeText(this, "Upper Left!",

Toast.LENGTH_SHORT);

toast.setGravity(Gravity.TOP | Gravity.LEFT, 0, 0);

toast.show();

开发 高质量 android应用 pdf,《打造高质量Android应用》读书笔记相关推荐

  1. android linearlayout属性大全,Android中LinearLayout布局的常用属性总结读书笔记

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 原CSDN博客已弃用,文章会逐渐迁移过来. 应朋友们反馈的Android基础薄弱的问题,决定出一套Android基础教程 ...

  2. 质量总监成长记(前三章)--读书笔记

    序:让人人成为克劳士比 笔记记录: 五个零缺陷的秘密:从改变生产模式向改变心智模式转变:从忙着解决问题向系统地预防问题转变:从改变产品.设备等硬件向改变人.组织等软件转变:从非此即彼的分割思想向整体思 ...

  3. python开发技术详解pdf下载_python开发技术详解附源码-python开发技术详解电子书pdf下载高清去水印版-精品下载...

    Python开发技术详解适合Python爱好者.大中专院校的学生.社会培训班的学生以及用Python语言进行系统管理.GUI开发.Web开发.数据库编程.网络编程的人员使用. 内容提要 Python是 ...

  4. Android原生PDF功能实现,Android开发面试书籍

    /** 加载PDF文件 */ private void loadPdf() { Intent intent = getIntent(); if (intent != null) { assetsFil ...

  5. 《Effective Python 编写高质量Python代码的59个有效方法》读书笔记

    具体的59条 第 1 章 用 Pythonic 方式来思考 1 第 1 条:确认自己所用的 Python 版本 1 第 2 条:遵循 PEP 8 风格指南 3 第 3 条:了解 bytes. str ...

  6. android c pdf,我把所有Android第三方库整理成了PDF,送大厂面经一份!

    目录 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样. PagerAdapter 介绍 ViwePager 缓存策略 ViewPager 布局处 ...

  7. android存储pdf文件怎么打开,android打开pdf文件

    我们在工作中肯定有需要,加载pdf或者doc的地方,但是,android没有提供一个好的打开方法,我又想吐槽下,人家ios可以直接打开的.. 有2钟方法打开pdf.doc. 方法一: 利用Intent ...

  8. android 最新pdf下载,深入剖析Android系统 (杨长刚) 中文pdf扫描版[127MB]

    <深入剖析Android系统>以Android Jelly Bean(4.1)的代码为蓝本,对Android的部分关键代码进行了注释分析,并辅以大量插图,讲述了Android大部分子系统中 ...

  9. 软件开发不是众人拾柴——《人月神话》读书笔记

    这里的"人月"指人数×月数,即劳动力×时间:这里的"神话"指一种理想的想法,即认为工作量=劳动力×时间,当时间有限而不能改变时,我们可以通过增加劳动力(人数)来 ...

  10. 《Android源码设计模式解析与实战》读书笔记(十六)

    第十六章.访问者模式 访问者模式是一种行为型模式,它是23种设计模式中最复杂的一个,虽然使用频率不高,但是并不代表可以忽略,在合适的地方,它会带来意想不到的灵活性.访问者模式,顾名思义使用了这个模式后 ...

最新文章

  1. npoi导出execl源码,vs2008实现,包括using库
  2. 在ARC环境中autoreleasepool(runloop)的研究
  3. 线上直播丨Hinton等6位图灵奖得主、百余位顶级学者邀你群聊AI
  4. System Center Virtual Machine Manager 2012 SP1系列文章
  5. 关于《关于一道C#上机题的一点想法》
  6. Ambari安装之部署3个节点的HA分布式集群
  7. linux内核网络协议栈--监控和调优:发送数据(三十)
  8. android 酷狗demo_Android仿酷狗旋转界面功能-自定义控件实现
  9. shanghai international trade center
  10. .net授权获取openid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权
  11. ubuntu linux下面运行《暗黑破坏神2》和英雄无敌3-死亡阴影
  12. 使用cloudbase-init初始化windows虚拟机
  13. mysql数据库存储多语言_数据库---数据控制语言(DCL)
  14. Solidity safesub防止溢出
  15. (一)apache atlas源代码编译与打包
  16. springboot2.x 集成百度 uidgenerator
  17. mysql数据结构_MySQL索引深入理解底层数据结构
  18. VS2022社区版安装教程
  19. string 析构崩溃 assign
  20. 单个html网页挂载IIS(不放在已经发布的项目下)并通过内网穿透代理公网可访问

热门文章

  1. Python和C++交互
  2. asp.net学习笔记1
  3. 基于raphael 的图形变化
  4. 一步步入门搭建SpringSecurity OAuth2(密码模式)
  5. 《高性能javascript》随笔
  6. 多家公司布局大数据基金 策略模型待检验
  7. Omi教程-生命周期和事件处理
  8. 析构函数定义为虚函数原因
  9. Qt在VS2012中引用QtWidgets时报GLES2/gl2.h无法打开错误的解决办法
  10. 0302-l2tp_***(ruijie)通用版