當前位置:編程學習大全網 - 源碼下載 - 怎麽查看Android sdk中的源碼demo,apidemo跟Android的版本有關系...

怎麽查看Android sdk中的源碼demo,apidemo跟Android的版本有關系...

1. Custom Dialog

Android支持自定義窗口的風格:

1)首先在資源裏面建立style的value;

example:

drawable/filled_box.xml

<shape xmlns:android="/apk/res/android">

<padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />

2)設置當前activity的屬性,兩種方式:1.在manifest文件中給指定的activity增加屬性

android:theme="@android:style/Theme.CustomDialog"。2.在程序中增加語句setTheme(R.style.Theme_CustomDialog);

PS1:如果只是將Acticity顯示為默認的Dialog, 跳過第壹步,只需要在manifest文中增加屬性:android:theme="@android:style/Theme.Dialog"或者在程序中增加setTheme(android.R.style.Theme_Dialog).

PS2:其他創建Dialog的方法:創建app.Dialog類或者創建app.AlertDialog類。

Next Study:能不能在Activity已經打開以後動態修改當前Activity的風格?

在測試中發現,在onCreate()事件中增加setTheme(),必須在setContentView()之前,否則指定的Style不能生效

2.Custom Title

Android除了可以為指定的Activity設置顯示風格,此外也可以為指定的Activity設置壹些特效,比如自定義Title,沒有Title的Activity或者增加壹個ICON等。

有意思的壹點是,這些特效並不是妳想設置的時候就行設置,妳需要在Activity顯示之前向系統申請要顯示的特效,這樣才能在下面的程序中為這些特效進行設置。(這樣是不是多此壹舉有待研究)

為壹個Activity設置自定義Title的流程:

1)為自定義的Title建立壹個layout(custom_title_1.xml)

<RelativeLayout xmlns:android="/apk/res/android"android:id="@+id/screen"

android:layout_width="fill_parent" android:layout_height="fill_parent"

android:orientation="vertical">

<textview android:id="@+id/left_text" android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:text="Left" />

<textview android:id="@+id/right_text" android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:text="Right" />

2)為activity設定自定義Title特效並指定Title的layout:

在onCreate()事件中增加:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

setContentView(R.layout.custom_title);

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1);

這三條語句的次序不能顛倒,依次為申請特效,創建view,設置特效屬性。其中requestWindowFeature等價於getWindow().requestFeature()

3)在需要修改Title的地方,獲取left_text或者right_text進行設置即可。

Next Study:Activity的其他顯示特效

Window還有其他壹些feature,比如FEATURE_CONTEXT_MENU,FEATURE_NO_TITLE,FEATURE_LEFT_ICON等,有待繼續學習研究。

1. Forwarding

這個實現很簡單,就是啟動新的Activity或者Service後,增加壹個finish()語句就可以了,這個語句會主動將當前 activity從歷史stack中清除,這樣back操作就不會打開當前activity。

做這個實驗的時候,發現開發Android程序需要註意的壹點小問題:增加新的activity時,不能只增加壹個class,壹定要記得要在manifest文件中增加該activity的描述。(這個簡單的功能,未來google應該給增加吧)

“android:name中的點”意義:首先manifest會有壹個默認指定的package屬性,比如指定為"com.android.sample",如果我們增加的activity的實現也在這個package下,則android:name為實現的類名,這個類名前加不加點都沒有關系,都會自動找到該實現,比如實現為forwardtarget,則android:name寫成forwardtarget或者.forwardtarget都可以。唯壹有區別的是,如果activity的實現是在默認包的子包裏面,則前面這個點就尤為重要,比如activity的實現是com.android.sample.app.forwardtarget,則android:name必須寫成.app.forwardtarget或者com.android.sample.app.forwardtarget。如果只寫app.forwardtarget,通常編輯器就會提示該類找不到,但不巧的是,妳恰好有壹個類是app.forwardtarget,那妳只有等著運行時報錯吧。

所以建議養成習慣只要是默認package下面的類,無論是否是在子包裏面,前面都要加上壹個點,現在當前實現是在默認package下。

2.Persistent

這裏的持久化其實就是本地配置文件的讀寫,實現方法是通過Activity.getPreferences(int)獲取SharedPreferences對象,然後操作配置文件的讀寫,值得註意的是以下幾點:

1)Activity.getPreferences(int mode)等價於Content.getSharedPreferences(String filename,int mode),這裏面的filename就是當前class的名稱,例如在PersistentTest類中調用getPreferences(0),等價於調用getPreferences("PersistentTest", 0)。如不想用class name做文件名,可以直接調用getSharedPreferences方法,自己指定配置文件的名稱。

2)mode值的定義:

MODE_PRIVATE = 0,表示當前配置文件為私有文件,只有當前的應用可以訪問。

MODE_WORLD_READABLE = 1,表示當前配置文件可以被其他應用讀取。

MODE_WORLD_WRITEABLE = 2,表示當前配置文件可以被其他應用寫入。

如果配置文件又想被人讀又想被寫人,怎麽辦呢,呵呵,當然是MODE_WORLD_READABLE&MODE_WORLD_WRITEABLE,真的懷疑設計android的人以前是做C/C++的。

3)SharedPreferences是個很有意思的實現,讀取數據的時候,直接用get方法就可以了,可是寫數據的時候,沒用給set方法,呵呵,第壹次用這個類壹定會以為只能讀不能寫。如果要寫數據的話,需要用editor()方法(為什麽不是getEditor()呢?看來設計的人壹定是做C/C++的)獲取SharedPreferences.Editor類,然後用這個類的put方法寫文件。為什麽要這樣做呢?好久沒有看設計模式了,不知道他采用是哪種高級模式,等以後有時間,看看它的實現再做研究吧。

4)在這個實現中,讀文件是放在onResume()中,寫文件是在onPause()中,為什麽要這麽做呢,看字面意思,好像只有恢復和暫停的時候才會被執行,那程序第壹次創建的時候會讀文件嗎?來讓我們看看Activity的生命周期,就會發現這麽做的巧妙之處:

看到了吧,在Activity運行的前後,無論狀態怎麽轉移,onResume()和onPause()壹定會被執行,與其說實現的巧妙,還不如贊壹下這個生命周期的設計的巧妙,這個巧妙不是說說而已,有時間的話,看看MFC中壹個windows或者dialog的生命周期,妳就知道這個巧妙的含義了,我們可以省多少的事情啊!所以值得記住的是,在android中想在運行前後必須要執行的語句,就應該放在onResume()和onPause()中。

4)最後說壹個對android小不爽的地方:drawable,什麽鬼東西啊!在res/drawable放壹個文件,訪問的時候是drawable/name,如果在values裏面建立壹個drawable的變量,訪問的時候也是drawable/name,例如在drawable目錄下放入壹個red.xml文件,訪問的時候是@drawable/red,如果建立壹個drawable的變量red,訪問也是@drawable/red,這完全就是兩個東西啊,雖然最新的編輯器會提示重名,但查找的時候真的很不方便啊,尤其是drawable變量,可以放在壹個abc.xml中 。

這個實驗描述了Activity之間的另外壹種切換方式,通常Activity的切換方式是Activity1通過startActivity切換到Activity2, Activity2再通過startActivity切換到其他的Activity,但是有的時候我們需要啟動壹個新的Activity獲取用戶的輸入,然後返回到原來的Activity,比如activity是壹個通訊錄列表,我們通過壹個增加按鈕打開另壹個activity讓用戶輸入新的聯系人,輸入後再返回通訊錄列表。

這個時候,我們可以通過startActivityForResult(Intent, int)方法啟動新的Activity,新的Activity通過setResult(int, Intent)方法返回老的Activity,這個時候會觸發老的Activity的onActivityResult(int, int, Intent)方法,我們可以在這個方法的實現中處理返回事件。

startActivityForResult(Intent, int),其中int為Request Code,也是onActivityResult的第壹個參數,通常壹個Activity不僅僅只觸發壹個獲取事件,比如上面提到的通訊錄,可能會有壹個增加聯系人的事件,也可能會有壹個修改聯系人或給指定聯系人增加壹個電話的事件,但我們只有壹個onActivityResult方法,所以我們需要這麽壹個Request Code區分是哪個事件的返回,這個值是用戶自己定義的,而且完全是用戶自己進行管理,很人性化。

setResult(int, Intent),其中的int是Result Code,它表示的是返回的狀態,也是onActivityResult的第二個參數。這個參數需要特別註意壹下,android為這個值提供了三個默認的常量。我們先看前兩個,RESULT_CANCELED和RESULT_OK,這個從字面上很好理解,壹個是運行取消,另壹個是運行成功返回,當用戶按BACK鍵時,Result Code就是RESULT_CANCELED。但我們看看他們分別對應的值,就會發現奇怪的地方,RESULT_CANCELED=0,RESULT_OK=-1!!!在其他系統中OK通常都是1,而在android,它是-1,這是為什麽呢,來讓我們看看第三個默認的常量,RESULT_FIRST_USER=1,明白了吧!android把所有大於0的數字都留給了用戶自己,多麽人性化啊!但是要註意了,如我前面所說,大部分系統都喜歡將大於0作為正確返回,小於0作為錯誤返回,所以很多人(包括我),喜歡用if(result > 0)表示返回成功,這個在android是不通行的,壹定要特別註意!

此外在這個程序中,我們可以看到另外壹件事情,關於TextView,如果我們要改變裏面的內容,比如增加新的字段,需要將其設為可變長的,方法是mTextView.setText(mTextView.getText(), TextView.BufferType.EDITABLE);

修改內容的方法是通過TextView.getText()獲取Editable對象,然後Editable對象進行編輯就可以了,Editable類似於StringBuffer,編輯之後會直接反映到TextView裏面,不需要再setText();

2. SaveRestoreState

完全沒有看懂這個Demo要演示什麽效果,好像是onSaveInstanceState以及TextView的android:freezesText屬性有關,但具體效果沒有研究出來,留到以後再研究吧

3.Translucent

Android為透明效果提供了內置的Theme: android:style/Theme.Translucent,只需要把當前的activity的theme設置為這個Theme就可以達到完全透明的效果。

如果要半透明的話,可以增加壹個繼承該Theme的style即可,實現如下:

#e0000000

此外API Demo中提供了另壹個實例,不用繼承內置的Theme,可以自己完全創建壹個新的style,實現透明效果,同時可以加壹些其他特效,比如模糊化等,

  • 上一篇:DLL、API、ocx之間有什麽聯系
  • 下一篇:能不能通過js代碼打開攝像頭
  • copyright 2024編程學習大全網