Skip to content
Ider

沉淀我所学习,累积我所见闻,分享我所体验

Primary Navigation Menu
Menu
  • Home
  • About Ider
    • Who Ider?
    • Why Ider?
    • How Ider?
    • Where Ider?
    • What Ider?

Android (Page 3)

2015-07-31
31 July
On July 31, 2015
In Article Collection(聚宝收藏), Front Interface(界面构想)

一闪一闪的Android视图

在创建Android的布局文件时会用到各种标签来定义视图,对于这些标签总能项目代码或者Android的源码中找到对应的类定义。如果标签是包含了整个包(package)路径,那么就可以直接对应到该视图类上;假如标签只是个简单的类名,那么系统就会以下边的前缀列表依次去寻找该类。
[codesyntax lang=”java” lines=”normal”]

private static final String[] sClassPrefixList = {
    "android.widget.",
    "android.webkit.",
    "android.app."
};

[/codesyntax]

万一类不存在,那就说明这个布局文件将无法正常地被LayoutInflater填充成视图层次结构。不过也有几个标签是没有对应的类定义的,但它们在Android开发文档中有被介绍,比如<include/>和<merge/>标签。它们作为视图优化的功能标签,并不生成实际的视图呈现在页面上。对这两个标签的具体处理方式,可以在LayoutInflater的源码中找到答案。

在源码中会可能会看到一些其他特殊的标签定义,本文就是要来介绍其中的<blink/>标签。这个标签并没有在文档中做任何介绍,实际上只是Android 4.0(Ice Cream Sandwich, ICS)带进来的一个菜单而已。使用这个标签包裹其他视图,可以让其不停地闪烁:

[codesyntax lang=”xml” lines=”normal”]

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

    <blink android:layout_gravity="center"
           android:layout_width="match_parent"
           android:layout_height="wrap_content">

        <TextView android:layout_gravity="center"
                  android:textSize="21sp"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="http://blog.iderzheng.com"/>

    </blink>

</FrameLayout>

[/codesyntax]

blink标签效果

http://blog.iderzheng.com/wp-content/uploads/2015/07/android-blink-tag.webm

blink标签其实也是又对应的类定义的,而且它就定义在LayoutInflater里。从源码中可以看出它只是一个FrameLayout然后间隔地在页面上绘制视图。

[codesyntax lang=”java” lines=”normal”]

private static class BlinkLayout extends FrameLayout {
    private static final int MESSAGE_BLINK = 0x42;
    private static final int BLINK_DELAY = 500;
    
    private boolean mBlink;
    private boolean mBlinkState;
    private final Handler mHandler;
    
    public BlinkLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                if (msg.what == MESSAGE_BLINK) {
                    if (mBlink) {
                        mBlinkState = !mBlinkState;
                        makeBlink();
                    }
                    invalidate();
                    return true;
                }
                return false;
            }
        });
    }
    
    private void makeBlink() {
        Message message = mHandler.obtainMessage(MESSAGE_BLINK);
        mHandler.sendMessageDelayed(message, BLINK_DELAY);
    }
    
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        
        mBlink = true;
        mBlinkState = true;
        
        makeBlink();
    }
    
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        
        mBlink = false;
        mBlinkState = true;
        
        mHandler.removeMessages(MESSAGE_BLINK);
    }
    
    @Override
    protected void dispatchDraw(Canvas canvas) {
        if (mBlinkState) {
            super.dispatchDraw(canvas);
        }
    }
}

[/codesyntax]

不知道大家在Android的源码中找到过哪些彩蛋,欢迎分享。

2015-06-30
30 June
On June 30, 2015
In Data Structures(数据结构), Design Patterns(设计模式), Knowledge Base(心得笔库), Mobile Development(移动开发)

Android自定义View中MeasureSpec浅析

Android的API为开发者提供了很多好用的widget和control,但在开发中依然会需要自定义一些额外的控件来满足特定的需求。当自定义的视图比较复杂时,就会跟onMeasure(int, int)、onLayout(boolean, int, int, int, int)、onDraw(android.graphics.Canvas)这些方法打交道。要在新创建自定义视图类里正确重载实现这些方法,就需要对这些方法的作用,参数意义有所了解。

本文就来对onMeasure(int, int)方法涉及到的MeasureSpec来做个简单介绍,讲讲它的值的含义,每个状态量都是在什么情况下形成,又该如何使用这些值。
Read More →

2015-06-06
06 June
On June 6, 2015
In Data Structures(数据结构), Knowledge Base(心得笔库), Mobile Development(移动开发)

利用Java的注解,维护Android的代码

对于Java这门语言,我的态度应该是讨厌多于喜欢。整个大学我只上过一门Java的选修课算是有了Java的入门知识,之后用得更多的则是C#。在研究生阶段也是以C++和C#为主。直到工作需要做Android开发才拾起Java作为主打开发武器,所以很多Java的知识对我而言可能只是懂一个肤浅的表面。好在身边有很多的大神总是愿意耐心提供帮助,引导我进入Java新的知识领域,再加上网上的一些搜索和补充,让我的知识变得更加全面。

比如WeakReference在一定程度上帮助解决了Activity和Fragment泄露的问题;多线程时要注意的同步问题;内部类调用其外部类的私有方法和变量产生了合成方法(Synthetic Methods)造成的性能影响和Android的dex溢出。

最近又得益大神们的教诲,被反复强调一定要善用Java的注解(annotation)。这让我感觉,当我还在思索要怎么写代码的时候,别人已经在考虑着怎么告诉编译器和其他开发者他们写了什么东西。

不过在坚持使用Annotation数月之后,我也深深体会到了它对写代码带来的好处而停不下来。比如方法上加个@Override就可以大大减少把重载方法名字的或者变量参数写错的几率,同时在浏览文件时一眼就能看出哪些是新增方法,哪些来自父类;在对象变量上放一个@Nullable,IDE就能帮助我们快速指出哪里有可能会出现NullPointerException这个恼人却又简单能解决的问题,不用等到运行时异常被抛出了才去解决;而加上@NonNull就可以随心所意的直接使用变量而无需加if语句了检查null。

还有在Android开发中最常用到的那些指示资源的标示(Resource Id),全部都是整型数,其实有很多的类型如R.id、R.string、R.drawable。如果不小心,就很容易弄错而得到了非所需的结果。特别是R.style和R.styleable两个常常会被IDE的自动补全所迷惑;还有整型的Color值和R.color也很容易出错。现在只要在变量前加上对应类型的Android Support Annotation,就可以大大地规避这些问题出现的几率。

虽然对于有经验的开发者来说这些小问题都会自动避免,再不小心运行时也会发现问题。但不是所有接触和使用这些代码的人都能一样的小心。万一别人的失误落到自己头上修复,也只能无奈抱怨一句:这人怎么这么不小心呢。

简单的加上一些annotation,那么一旦在代码中出现错误的使用,IDE就会高亮显示错误的地方让人一目了然,也能及时修改这些错误,不用等到运行后才去debug:

support_annotation

Read More →

2015-04-30
30 April
On April 30, 2015
In Design Patterns(设计模式), Knowledge Base(心得笔库), Mobile Development(移动开发), Programming Life(程序人生)

黑科技尝鲜从ListView迁移到RecyclerView

在《RecyclerView体验简介》里已经介绍了RecyclerView目前的可用情况,也提供了一些文章的链接来了解这个新的Android视图的使用方法,API的调用方式。但由于RecyclerView的Adapter需要开发者重新实现,这相当于一次完整的重构了。本文就来介绍一下我在尝鲜RecyclerView所使用到的非常规手段,如果您也只是想尝试一下把原有的程序转到RecyclerView下看看效果,也许本文会有一些帮助。

ViewHolder-挂羊头卖狗肉

之前已经强调RecyclerView强制要求使用ViewHolder模式。但即使是强制,也可以采用“上有政策,下有对策”,敷衍地实现一个子类就好:

[codesyntax lang=”java” lines=”normal”]

public class DummyViewHolder extends RecyclerView.ViewHolder {
    public DummyViewHolder(View itemView) {
        super(itemView);
    }
}

[/codesyntax]

至于缓存子项视图的内部视图到变量上,就先免了。

对于比较复杂的ListView子视图应该都会遵循使用ViewHolder,只是没有具体继承与某个基类。所以只要将那些自定义的ViewHolder显示继承RecyclerView.ViewHolder,再在构造函数里调用一下super(view);就好。
Read More →

2015-04-16
16 April
On April 16, 2015
In Design Patterns(设计模式), Front Interface(界面构想), Knowledge Base(心得笔库), Mobile Development(移动开发)

RecyclerView体验简介

前些日子,组里为了在目前的Android程序里实现基于ListView子项的动画效果,希望将最新的RecyclerView引入到程序中,于是我便花了一些时间研究了一下RecyclerView的基本情况。本文算是对这些日子里了解的内容做一些汇总。

在网上关于RecyclerView的基本使用方式已经有了比较详细介绍,而且其设计结构也类似于ListView,所以本文将不重点介绍如何使用,在文末的引用中都可以相关内容。这里主要是介绍RecyclerView的基本功能、设计理念,以及系统提供API的情况。

什么是RecyclerView

RecyclerView是在Android L(也就是后来的Lollipop)中新加入的一种ViewGroup。但因为它使以support-v7库的形式加入到Android系统中,所以不仅仅是Lollipop版本以后的Android系统可以使用,只要系开发项目中引入这个库就在任意API级别中使用。不过查阅其文档,可以感受到RecyclerView是如此的强烈的“还在完善中”的感觉,因为对它的介绍只有短短的一句话:

A flexible view for providing a limited window into a large data set.

单看这句话,其实已经被经常使用的ListView和GridView基本也是满足这句描述的。而且从单呈现效果来看RecyclerView和ListView、GridView并没有大多的差别。

不过它的“flexible”并不单单指它可以在ListView和GridView之间随意互相切换,更在于它可以创造出更多的复杂的可滚动的视图,比如水平方向的ListView,或者是Web上很流行的瀑布流式布局(Masonry)。只是大部分布局系统都没有提供,必须由开发者自己实现。

所以RecyclerView的“flexible”:什么都可以做,但什么都要自己做。
Read More →

2014-09-30
30 September
On September 30, 2014
In Data Structures(数据结构), Design Patterns(设计模式), Knowledge Base(心得笔库), Mobile Development(移动开发)

了解Android中的Preference结构的设计与实现

之前的文章讲到Preference和Setting在本质上是相似的,并相信介绍了SharedPreferences的基本使用方式和其代码设计。但SharedPreferences只能算是设备背后的不可见的存储那一部分,而可见的界面其实对于用户来说更加重要,而这一部分就是本文要讲的那些在android.preference包下的各种Preference。

不过本文不会涉及这些Preference的使用方式,比如如何定义XML文件、如何使用PreferenceActivity和PreferenceFragment加载设置,这些都可以在Android Developer的官方指南里了解到详情。本文主要通过分析源代码来分享Preference的设计和实现方式,让开发者们在今后更加顺手地使用和扩展Preference类,或者在设计其他类似的界面和功能时可以提供参考帮助。

Preference概览

Android的设置界面本质上就是ListView:PreferenceActivity是继承了ListActivity;而3.0以后推荐使用的PreferenceFragment虽然没有继承ListFragment,但也定义了ListView字段。

settings

Read More →

2014-08-20
20 August
On August 20, 2014
In Design Patterns(设计模式), Knowledge Base(心得笔库), Mobile Development(移动开发)

了解Android API中的SharedPreferences

Preference翻译为偏好,但实际上它可以算是Setting(设置)的别名。两种叫法给人的差异在于针对的对象不同:设置更倾向于设备的属性,修改设置便是改变设备的功能;偏好则倾向于用户的性格,用户基于其个人的偏好来来形成设备的差异化。但是总体而言,他们是一致的,都是通过用户的需求改变设备的体验。

在Android的开发过程中,会在使用的API中见到很多名字中带有Preference的类和接口,此篇文章就来介绍一下这些“*Prefere*”的功能和用途。

在Android提供API中,带有Preference的其实主要分为两类:一类是android.content包下的SharedPreferences,另一类则是android.preference包下的Preference。它们分别实现不同功能,却又相互联系合作完成对Android程序的控制。

SharedPreferences简介

SharedPreferences是以复数形式存在,因为在Android中它是用来存储键值对(Key-Value Pair)数据的集合。API中包含了多个方法来方面读取相应类型的数据:

[codesyntax lang=”java” lines=”normal”]

String getString(String key, String defValue);
Set<String> getStringSet(String key, Set<String> defValues);
int getInt(String key, int defValue);
long getLong(String key, long defValue);
float getFloat(String key, float defValue);
boolean getBoolean(String key, boolean defValue);

[/codesyntax]
Read More →

2014-07-19
19 July
On July 19, 2014
In Article Collection(聚宝收藏), Knowledge Base(心得笔库), Mobile Development(移动开发)

开发Android必知的工具

tools程序开发有时候非常依赖使用的开发工具,好的完备的开发工具可以让开发人员的工作效率有大幅度的提高。开发Android也是如此,大家可能都离不开Eclipse或Android Studio这些工具,但他们其实是集成开发环境(Integrated development environment, IDE),把很多工具集成在一个里面,配合可视化界面和键盘快捷键,方面寻找和使用。

不过有时候工具集成太多了,往往让人感到迷惑容易遗忘某个工具的存在。本文就谈谈Android开发和Debug时可使用的一些工具,这些工具都可以在安装了Android SDK的Eclipse或Android Studio找到相应的菜单和按钮来打开使用。但考虑到IDE很多时候打开速度实在太慢了,还是考虑直接使用指令在终端单独开打它们吧。

如果安装了Android Studio,这些工具可以在其安装包中找到,比如在Mac下它们就保存在/Applications/Android Studio.app/sdk/tools路径下。如果是使用Eclipse,那么就需要手动下载Stand-alone Android SDK,解压之后也能在其下的tools文件夹里找到。
Read More →

2014-06-24
24 June
On June 24, 2014
In Front Interface(界面构想), IT Products(数码产品), Mobile Development(移动开发)

Amazon的Fire Phone之于Android开发者

在上周Amazon也耐不住加入了手机竞争行列之中,发布了自己的Fire Phone,于是Android家族又多了一位变种成员,Android系统的碎片化程度也进一步加剧。因为工作的关系,我有幸在上个月就得到了一部工程机为其做提前开发,不过因为政策原因所以到现在才能来谈谈对这部新手机的看法。

对于Fire Phone的功能以及外观,官方网站和各家技术网站都有了详尽的介绍和报道,再者因为我拿到的是工程机,无法体现到完备的功能展现,因此本篇文章谈的主要是Fire Phone对于开发者而言所要面对的问题和状况。
Read More →

2014-06-13
13 June
On June 13, 2014
In Article Collection(聚宝收藏), IT Products(数码产品), Mobile Development(移动开发)

关闭Android File Transfer的自动启动功能

作为一个Mac和Android的深度用户,Android File Transfer可以说是电脑上必备的应用程序。虽然我的大部分的Android设备都已经开启了开发者模式,所以基本的设备与电脑间的文件传输功能都可以用adb pull和adb push指令完成。但是Android File Transfer的可视化界面和自然的拖拽还是显得更加的方便。而且当设备连接上电脑时,程序就会自动启动,也非常的直接和实用。

android-file-transfer

不过这个自动启动功能,最近还是带来了不少的麻烦。因为每天都在做Android开发测试,所以会频繁的连接和断开设备,于是Android File Transfer就反复的起来打扰我,而且不知道为什么经常出现死机的状态:鼠标无法移动,按键盘也没有任何响应。虽然在重新断开再连接,反复几次之后电脑也会回复正常,但是不停碰到这样的情况也是非常恼火的。所以就找了一下关闭其自启动功能的方法,分享在此。
Read More →

Posts pagination

Previous 1 2 3 4 Next
Facebook
Twitter
LinkedIn
RSS
ZhiHu

Recent Posts

  • 三年居家工作感受
  • Pixel Watch智能手表和Pixel 5, 6 Pro 及 7 Pro手机
  • 我拥有过的无线耳机
  • 毕业工作一个月,我差点被开除
  • 我拥有过的移动硬盘
  • ProtoBuf 2.0 method count optimization for android development
  • 面过100场行为面试后

Categories

  • Algorithm Analysis(算法分析)
  • Article Collection(聚宝收藏)
  • Data Structures(数据结构)
  • Design Patterns(设计模式)
  • English Posts(英文写作)
  • Front Interface(界面构想)
  • IT Products(数码产品)
  • Knowledge Base(心得笔库)
  • Language Tips(语言初试)
  • Mathematical Theory(数学理论)
  • Mobile Development(移动开发)
  • Programming Life(程序人生)
  • Reading Notes(阅而后知)
  • Software Engineering(软件工程)
  • Special Tricks(奇技妙招)
  • Tangential Speech(漫话杂谈)

Tags

Aero Android API Bash Binary Search Bitwise Operation Book C/C++ Career Chrome Conference CSS Debug Device DOM Extension Framework Game Gradle Hearthstone HTML Initialization Intellij Interview iOS Java JavaScript jQuery Keyword Language Issues Mac Microsoft Mobile Modifier Objective-C PHP Principle Reference Regular Expression Static String Tools Tutorial UI XML

Blogroll

  • Ahmed's Blog
  • Gert Lombard's Blog
  • Gordon Luk
  • Jack & Allison
  • 开发部落

Archives

Designed using Chromatic. Powered by WordPress.