《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再来一次原则》

现在要做的事情,就是把以前的重复流程在用一次。

  1. 创建CriminalIntent应用。
  2. 为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

 

具体的流程我们在走一遍

  1. 初始化仓库
  2. 添加源代码
  3. 提交到本地库
  4. 创建远程的数据仓库
  5. 提交远程仓库

 

初始化仓库

在没有初始化以前使用 $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

……

文件的路径要打全,否则会显示找不到这个文件。

posted @ 2015-03-25 10:35  苍林  阅读(1961)  评论(0编辑  收藏  举报