《Android编程权威指南》-读书笔记(十)-从一个内涵段子开始第二个例子
《Android编程权威指南》-读书笔记(十) 第二个例子
-从一个内涵段子开始第二个例子
以前只知道写程序很牛X,结果学了这个专业才知道不是那回事,学的东西那么多,学完就忘。好容易写了个程序,写完了也忘的差不多了。最后我发现了这个事情的根源,这是一个智商问题。一直到有一天一个同学给我讲了一个内涵段子。
从前有一个旅者在深山老林里发现了一个民宅。里面住了一个老奶奶和两个女儿。因为是山里没有啥娱乐活动,晚上他们决定做爱做的事情。为了保证公平他们约定每人每次10下,依次循环。二女儿最小最先来,1,2,3。。10很快就结束了。大女儿成熟一些她很快发现了诀窍1….2….3……..10。到了老奶奶的时候1,2,3,4,2,2,3,4,3,2,3,4再来一次。。。
从此,我似乎明白了一些什么。
我将此神技命名为《3234再来一次原则》,并将此原则贯彻我所有文章的始末,无私奉献给大家。后面开始会有越来越多的代码段,这些代码段大神们看一遍都能记住,我每次都需要打开官方的Api复制粘贴一遍。使用特别多的代码段我一般都用此原则反复输入一直到我记住为止。
这里是官方的Fragments,在本例子中只取了2小段代码段。本书的作者非常准确的选取了最小量的可重用代码。
http://developer.android.com/guide/components/fragments.html
如果是初学者强烈不建议现在观看,因为会进入无限链接的循环之中,而且收效甚微。当熟悉到一定程度以后,在去看官方的文档,这个时候你就会思考,我以前看的XX傻缺的文章写的真烂。这个时候才是真正有收获的时候。
本章目标:
-
开发一个名为CriminalIntent应用
-
Fragment的引入
如果我现在开始依照前面几章的模式继续写下去,首先的问题就是中间开始看文章的人可能会不理解Android Studio的一些操作,还有那莫名其妙的Git代码。最重要的是,很多东西我自己也忘记了,有必要在来一次。
我会把所有的操作在详细的记录一次。所有的《3234再来一次原则》的内容是可以忽略的。
->《3234再来一次原则》
现在要做的事情,就是把以前的重复流程在用一次。
-
创建CriminalIntent应用。
-
为CriminalIntent创建新的仓库。
创建CriminalIntent应用
在这里选择Start a new Android Studio project
在Configure your new project界面里
Application name: CriminalIntent
Company Domain: lijing.example.com
Project location: E:\Android\example\CriminalIntent
点击Next
在Select the form factors you app weill run on界面里,是的,没有Target SDK,也没有Compile SDK。本来想任性选4.4,但是为了尽量跟本书靠拢我选了4.2。点击Next。
在后面的内容中我们需要做一次练习用来手动添加Fragment。所以这里,依然选择Blank Activity。点击Next。
在Creates a new blank activity with an action bar.界面里
Activity Name: CriminalActivity
Layout Name: activity_crime
其他默认。单击Finish。
为CriminalActivity创建新的仓库
E:\Android\example\CriminalIntent是我们存放这个应用的位置。在这一级别目录的目录浏览器里,右键->Git Bash
会直接进入Git的工作目录
关于安装和下载Git客户端的行为可以参看如下:
http://www.cnblogs.com/canglin/p/4331116.html
具体的流程我们在走一遍
-
初始化仓库
-
添加源代码
-
提交到本地库
-
创建远程的数据仓库
-
提交远程仓库
初始化仓库
在没有初始化以前使用 $git init 会得到一个提示Initialized empty Git repository in ….
$git init
$git status
就会得到上图红色文件需要提交
添加源代码
因为Android Studio 会自动添加.getignore所以,这步我们能省则省。
$git add .
提交到本地仓库
$git commit –m "ini CriminalIntent"
$git status
完成
创建远程的数据仓库
可以得到https://git.oschina.net/canglin/CriminalIntent.git
添加远程仓库
$git remote add CriminalIntent https://git.oschina.net/canglin/CriminalIntent.git
$git remote –v
注意:可以使用git remote remove CriminalIntent移除掉这个
提交代码到远程仓库
因为是不一样的代码是不能直接提交的需要先pull
$git pull CriminalIntent master
$git push CriminalIntent master
然后中间会提示输入账号密码,就可以输入了。
至此所有的代码已经添加完成,现在我们可以查看代码了
http://git.oschina.net/canglin/CriminalIntent/commit/e33f6f591523294563911a862e89eb3d9e649435
0e20f9824做了一次合并操作。
->《3234再来一次原则》 结束
后面接着开始继续后面的目标,编写我们的第二个示例应用。从第二个例子开始,作者引入了fragment。对于为什么要引入这个fragment,作者给出了一个很任性的理由《总是使用fragment原则》。Fragment当然是极好的,简单的理解可以是它可以作为界面的一部分存在,甚至Activity的界面完全可以由不同的Fragment组成。Fragment有自己的生命周期,能处理事件。我们还可以动态的添加、替换和移除某个Fragment。
这个例子就是在一个容器视图里面动态的添加了一个Fragment。这个Fragment只是一个简单的Edit控件。不考虑生命周期,不考虑各种插入方式,不考虑显示效果。只是存粹的演示动态的插入一个Fragment。
首先将CrimeActivity 由Activity扩展,改为由FragmentActivity。系统会自动import android.support.v4.app.FragmentActivity;
然后删除掉onCreateOptionsMenu()
创建一个新类Crime拥有2个字段
private UUID mId;
private String mTitle;
快键Alt+Insert 选择Getter and Setter 选择mTitle,他会自动生成mTitler的Getter和Setter。
快键Alt+Insert 选择Getter 选择mId,他会生成mId的Getter。
快键Alt+Insert 选择Constructor
代码如下:
http://git.oschina.net/canglin/CriminalIntent/commit/77fa667a17d200d491dd29bf0a59ee98a1f8503c
这次的代码出了问题,我在创建项目的时候可能点错了东西
事实上我创建的项目CriminalActivity是扩展至ActionBarActivity,而不是上个例子的Activity,在第8行。我修改为了FragmentActivity。这些都是无关紧要的。
定义容器视图
容器视图也就是放Fragment的layout文件,这个应用里它在res/layout/activity_crime.xml
这个视图里就一个FrameLayout,后面讲编写fragment视图放置到这个FrameLayout里。
接下来就要定义要放进去的东西。创建一个fragment,你必须创建一个Fragment的子类,这个子类是类似Activity的。它包含onCrate(),onStart(),onPause(),onStop()。我在在这里只实现onCreate()和 onCreateView()就足够了。
定义CrimeFragment的布局 res/layout/fragment_crime.xml
在res/layout上面右键New->Layout resource file
File name:fragment_crime
Root element填写为LinearLayout后就不需要在修改了,不改的话进去后做相应的修改。
点击ok 在加入一个EditText。Fragment视图的布局文件Fragment_crime.xml就编写好了。
创建CrimeFragment的类
在java/com.example.lijing.criminalintent下点击右键New->Java Class ,类名为CrimeFragment。
CrimeFragment 扩展自Fragment。在Fragment上Alt+Enter。我默认的import android.app.Fragment;好吧不管它,先就这样写着。这个Fragment是跟书上介绍的是不同的,书上在后面才介绍android.app.Fragment我这里只是提前了而已。
代码如下:
http://git.oschina.net/canglin/CriminalIntent/commit/1d37164857886bd8da968c89fac42bbeb82f02b4
CrimeFragment类需要重写2个方法
onCreate()和onCreateView()。这2个方法必须是public的,因为需要被任何activity调用。
在Fragment里的View会有一些不同,但是上段代码可以做为作者的小技巧。每次使用View的时候就这么写。
http://git.oschina.net/canglin/CriminalIntent/commit/bf706d8ad27710b1783d6c39c02c9b47eae053ad
至此要添加的Fragment也做好了,然后我们在将新增CrimeFragment视图添加进去。添加UI fragment到FragmentManager。
在添加的过程中涉及到的FragmentManager、FragmentTransaction在本例中都不做详细的描述。因为已经最细化了,现阶段要做的就是记住就可以了。
《3234再来一次原则》 –值得反复输入背诵的代码
与Activity交互的代码段
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle saveInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime, parent, false);
return v;
}
FragmentTransaction相关代码段
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new CrimeFragment();
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
插入代码如下:
http://git.oschina.net/canglin/CriminalIntent/commit/94fcabfbf735017c480242a8d49db0a3c92d0c39
小结:
本章主要展示了如何创建和动态插入一个Fragment。同时回顾了一下Git的用法。我们没有进一步的讨论更深入的话题,这些将在下一篇文章中介绍。本章就是看看怎么用。本章的正常阅读方法还是结合文章然后打开文章各个阶段的Git代码段。在对比文章看看哪些代码发生了改变。在Git中都非常详细的做出了描述,这些描述精确到了每一个字符。
新技巧:
本章根据书中的例子,删除了strings.xml中menu相关的字符串,在编译的时候会报错。具体操作可以在Git的代码列表中发现。我们在例子中可能要注释掉menu 相关的代码,并且删除掉app/src/main/res/menu/menu_criminalIntent.xml。因为是在项目里删除的所以我们在git里就要多做一次操作如图:
指令为:
$git rm app/src/main/res/menu/menu_criminal.xml
……
文件的路径要打全,否则会显示找不到这个文件。