《Android編程權威指南》-讀書筆記(十) 第二個例子 html
-從一個內涵段子開始第二個例子java
之前只知道寫程序很牛X,結果學了這個專業才知道不是那回事,學的東西那麼多,學完就忘。好容易寫了個程序,寫完了也忘的差很少了。最後我發現了這個事情的根源,這是一個智商問題。一直到有一天一個同窗給我講了一個內涵段子。android
從前有一個旅者在深山老林裏發現了一個民宅。裏面住了一個老奶奶和兩個女兒。由於是山裏沒有啥娛樂活動,晚上他們決定作愛作的事情。爲了保證公平他們約定每人每次10下,依次循環。二女兒最小最早來,1,2,3。。10很快就結束了。大女兒成熟一些她很快發現了訣竅1….2….3……..10。到了老奶奶的時候1,2,3,4,2,2,3,4,3,2,3,4再來一次。。。git
今後,我彷佛明白了一些什麼。編程
我將此神技命名爲《3234再來一次原則》,並將此原則貫徹我全部文章的始末,無私奉獻給你們。後面開始會有愈來愈多的代碼段,這些代碼段大神們看一遍都能記住,我每次都須要打開官方的Api複製粘貼一遍。使用特別多的代碼段我通常都用此原則反覆輸入一直到我記住爲止。 瀏覽器
這裏是官方的Fragments,在本例子中只取了2小段代碼段。本書的做者很是準確的選取了最小量的可重用代碼。app
http://developer.android.com/guide/components/fragments.htmlide
若是是初學者強烈不建議如今觀看,由於會進入無限連接的循環之中,並且收效甚微。當熟悉到必定程度之後,在去看官方的文檔,這個時候你就會思考,我之前看的XX傻缺的文章寫的真爛。這個時候纔是真正有收穫的時候。佈局
本章目標:ui
若是我如今開始依照前面幾章的模式繼續寫下去,首先的問題就是中間開始看文章的人可能會不理解Android Studio的一些操做,還有那莫名其妙的Git代碼。最重要的是,不少東西我本身也忘記了,有必要在來一次。
我會把全部的操做在詳細的記錄一次。全部的《3234再來一次原則》的內容是能夠忽略的。
->《3234再來一次原則》
如今要作的事情,就是把之前的重複流程在用一次。
建立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
……
文件的路徑要打全,不然會顯示找不到這個文件。