《第一行代碼》學習筆記——第1章 開始啟程,你的第一行Android代碼,第一行代碼筆記
1.3 建立你的第一個Android項目
1.3.1 建立HelloWorld項目
1、Application Name代表應用程式名稱,手機上顯示的就是它;
2、Project Name代表項目名稱,其顯示在Eclipse中;
3、Minimum Required SDK是指程式最低相容版本,Compile With是指程式編譯版本;
1.3.3 分析你的第一個Android程式
1、src 是放置我們所有Java代碼的地方;
2、gen這個目錄裡的內容是自動產生的,主要有一個R.java檔案,你在項目中添加的任何資源都會在這裡產生一個相應的資源id。這個檔案永遠不要手動去修改它;
3、assets這個目錄用的不多,主要存放一些隨程式打包的檔案,在你的程式啟動並執行時候可以動態讀取到這些檔案的內容。並且,如果你的程式中使用到了WebView載入本地網頁的功能,所有網頁相關的檔案也都存放在這個目錄下;’
4、bin這個目錄主要包含一些在編譯時間自動產生的檔案。其中,安裝包就在這個檔案中;
5、libs目錄,如果你的項目中有使用到第三方Jar包,就需要把這些Jar包都放在libs目錄下,放在這個目錄下的Jar包都會被自動添加到構建路徑中去;
6、res目錄,簡單點說,你在項目中使用到的所有圖片,布局,字串等資源都是放在這個目錄下的,前面提到的R.java中的內容也是根據這個目錄下的檔案自動產生的;
7、AndroidManifest,xml這是你整個Android項目的設定檔,你在程式中定義的所有四大組件都需要在這個檔案裡註冊。另外還可以在這個檔案中給應用程式添加許可權聲明,也可以重新制定你建立項目時指定的程式最低相容版本和目標版本。’
8、project.properties這個檔案就是通過一行代碼指定了編譯器時所使用的SDK版本。我們這個HelloWorld項目使用的是API 14,你也可以在這裡改成其他版本試一試;
9、接下來我們來分析HelloWorld項目時如何運行起來的,開啟AndroidManifest,xml這個檔案,找出這個代碼:
<activity
android:name="com.example.helloworld.HelloWorldActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> //這兩行代碼錶示HelloWorldActivity是這個項目的主活動,具體什麼意思以後再說
</intent-filter>
</activity>
說明:這個代碼錶示對HelloWorld這個活動進行註冊,沒有在AndroidManifest.xml裡註冊的活動是不能使用的。
10、在介紹Android四大組件的時候說過,活動是Android應用程式的門面,凡是在應用程式中你看到的東西,都是放在活動中的。所以,當我們開啟程式的時候,你看到的東西實際上就是HelloWorldActivity這個活動。以下是這個活動的代碼:
package com.example.helloworld;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class HelloWorldActivity extends Activity { //表示HelloWorldActivity繼承自Activity。Activity是Android系統提供的一個活動基 類,我們項目中所有的活動都必須要繼承它才能擁有活動的特性。
@Override
protected void onCreate(Bundle savedInstanceState) { //onCreate()方法是一個活動被建立時必定要執行的方法
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_world); //此處調用的setContentView()方法,就是這個方法給當前的活動引入了一個布局
}
@Override
public boolean onCreateOptionsMenu(Menu menu) { //建立菜單,詳細後期補充
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.hello_world, menu);
return true;
}
}
看完這個代碼發現裡面並沒有HelloWorld字樣,那在活動中也就是在程式介面中顯示的HelloWorld!是在哪裡定義的呢?
其實Android程式設計講究邏輯和視圖分離,因此是不推薦在活動中直接編寫介面的,更加通用的一種做法是,在布局檔案中編寫介面,然後在活動中引入進來。那也就是說HelloWorld 定義在hello_world_layout.xml這個檔案中咯?下面我們開啟這個檔案,代碼如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".HelloWorldActivity" >
//上面看不懂沒關係,我們來看一看下面的代碼
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
其中TextView是Android系統提供的一個控制項,用於在布局中顯示文字的。在這個代碼中我們發現了HelloWorld字樣,但是這個真是在這裡定義的嗎?其實這裡也不是。真正的HelloWorld!字串也不是在這裡定義的。Android不推薦在程式中對字串進行寫入程式碼,更好的做法是把字串定義在res/values/string.xml裡,然後在布局檔案或者代碼中引用。下面是strings.xml代碼:
<resources>
<string name="app_name">Hello World</string> //修改APP名稱
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string> //採用索引值對的形式,HelloWorld!值對應了一個叫做hello_world的鍵。在 hello_world_layout.xml布局中就是通過引用了hello_world這個鍵,才找到相應的值
</resources>
1.3.4 詳解項目中的資源
1、res目錄:所有以drawable開頭的檔案夾都是用來放圖片的,所有以values開頭的檔案夾都是用來放字串的,layout檔案夾是用來放布局檔案的,menu檔案夾是用來放菜單檔案的。
2、如何使用這些資源?
比如剛剛說到的strings.xml中找到Hello world !字串,我們有兩種方式可以引用它:
(1)在代碼中通過R.string.hello_world 可以獲得該字串的引用;
(2)在XML中通過@string/hello_world可以獲得該字串的引用;
基本的文法就是以上兩點,其中string部分是可以替換的,如果是引用的圖片資源就可以替換成drawable,如果引用的是布局就可以替換成layout,以此類推。
另外,HelloWorld項目的表徵圖就在AndroidManifest.xml中通過android:icon = "@drawable/ic_launcher"來指定的,而ic_launcher這張圖片就在drawable檔案夾下,如果想修改項目的表徵圖就在這裡改。
1.4 掌握日誌日誌工具的使用
1.4.2 使用Android的日誌工具
1、Log.v() 對應層級 verbose,用於列印那些最為瑣碎的,意義最小的日誌資訊。是Android日誌裡面層級最低的一種。
2、Log.d() 用於列印一些調試資訊,這些資訊對你偵錯工具和分析問題應該是有協助的。對應層級debug。
3、Log.i() 這個方法用於列印一些比較重要的資料,這些資料應該是你非常想看到的,可以協助你分析使用者行為的那種。對應層級info。
4、Log.w() 這個方法用於列印一些警告資訊,提示程式在這個地方可能會有潛在風險,最好去修複一下出現警告的地方,對應層級warn。
5、Log.e() 這個方法用於列印程式中的錯誤資訊。對應層級error。
1.4.3 日誌工具怎麼使用
public class HelloWorldActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_world);
Log.d("HelloWorldActivity","onCreate execute"); //Log.d中傳入兩個參數,第一個慘數是tag,一般傳入當前的類名,主要用於對列印資訊進行過濾。第二個參數是msg,即想要列印的具體內容。
}