API Demos_App/Activity

此篇來看下App/Activity下的demos。
第一個Animation,展示瞭從一個activity啟動另一個activity時的兩種動畫效果,主要是這個方法:
1 overridePendingTransition(int enterAnim, int exitAnim)

這個方法跟在startActivity()或者finish()之後調用來指定一個效果,第一個參數是下一個activity出現的效果,第二個參數是該activity退出的效果。
關於animation,可以參考這篇文章:/kf/201111/109801.html。
第二個CustomDialogActivity,展示瞭一個activity如何使用自定義theme,使其看起來像一個dialog,在ApiDemos Manifest.xml中對應該activity的標簽下,
有該屬性:android:theme="@style/Theme.CustomDialog",引用瞭一個自定義的theme,在styles.xml文件中:
1 <style name="Theme.CustomDialog" parent="android:style/Theme.Dialog">
2     <item name="android:windowBackground">@drawable/filled_box</item>
3 </style>繼承自android內置的Theme.Dialog,位於/base/core/res/res/values/themes.xml。其background為一個自定義的shape,在filled_box.xml中:
1 <shape xmlns:android="http://schemas.android.com/apk/res/android">
2     <solid android:color="#f0600000"/>
3     <stroke android:width="3dp" color="#ffff8080"/>
4     <corners android:radius="3dp" />
5     <padding android:left="10dp" android:top="10dp"
6         android:right="10dp" android:bottom="10dp" />
7 </shape>solid填充,stroke描邊,corners圓角,padding內間距,關於shape,可以看下這篇文章:/kf/201202/120873.html這兒分享一個展現漸變色背景的方法,除瞭ps一張漸變色的圖片,也可以使用shape,將上面代碼的<solid>標簽替換成<gradient>代表漸變:
1 <gradient 
2      android:startColor="#52adcd" 
3      android:endColor="#1c87b1" 
4      android:angle="0" /> <!-  angle代表角度,0就是從左往右漸變,可以多用幾個值試一試 。這個標簽不能和solid標簽同時出現。-!>
第三個CustomTitle,如何自定義一個title,而不是使用一個activity原來的那種title,主要是3句代碼:
1 requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
2 setContentView(R.layout.custom_title);
3 getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1);
第四個DialogActivity展示瞭如何使一個activity看上去像一個彈出的dialog,跟第二個實例類似,也是在其activity標簽上加上theme屬性,不過這次引用的
是系統自己的dialog theme:@android:style/Theme.Dialog,其次跟第三個實例類似,也使用瞭requestWindowFeature()這個方法,關於這個方法,
網上有很多介紹,大傢可以自己搜一下,給個參考文章:/kf/201202/120872.html
第五個看下PersistentState和SaveRestoreState,先說SaveRestoreState展示瞭onSaveInstanceState()保存activity狀態的效果,其實本身沒做什麼,

onSaveInstanceState()是當該activity可能會被系統destory時默認調用的,默認會記錄佈局中每個view的狀態,如edittext的內容、checkedbox的選中狀態,
你需要做的就是給每個控件加一個id,沒有id的話是無法保存狀態的,可以看下源碼PhoneWindow.java中的saveHierarchyState()。一般情況下不需要你重寫
onSaveInstanceState(),但是如果你想保存除瞭UI狀態之外的其他附加信息,如一個成員變量的值等就可以覆寫,但要註意,一定要調用
super.onSaveInstanceState(),以上都可以在官方文檔裡找到。
再說下PersistentState,這個展示瞭使用SharedPreferences持久化的保存edittext的狀態,包括光標的位置。主要是在onPause()裡保存,onResume()裡還原,
不多說瞭,測試這兩個例子時,可以修改兩個edittext中的值然後旋轉手機,使其橫屏,這樣那個activity會destory然後再create。
第六個看下ReceiveResult,主要展示瞭startActivityForResult()的用法,這個可以用於比如從一個activity跳到另一個activity去選擇一個email地址或是一張圖片,
選擇完畢時結果再返回給上一個activity。我按照流程來介紹下這個方法的用法,ReceiveResult–>SendResult,首先先要調用
startActivityForResult(Intent intent, int requestCode)啟動SendResult,然後在SendResult這個activity中處理,處理完調用setResult (int resultCode, Intent data),
返回到ReceiveResult中,註意setResult()後要調用finish()。最後呢在ReceiveResult中要覆寫onActivityResult(int requestCode, int resultCode, Intent data)方法,
來處理返回的結果,一些細節大傢自己看看例子。關於requestCode,可以理解成A跳轉到B同時也可以跳轉到C或D,區分是跳到哪個activity;而resultCode,可以理解
成B可以返回多個值,OK或NOT OK等,區分一個activity返回的多個值,可以去看下Redirection這個例子,加強對startActivityForResult()的理解。
還有個知識點說下,在receiveResult的onCreate()中,mResults.setText(mResults.getText(), TextView.BufferType.EDITABLE);關於

void android.widget.TextView.setText(CharSequence text, BufferType type)這個方法,可以參考這篇文章:/kf/201202/120874.html
最好結合源碼來看這個方法,從TextView的setText( CharSequence text, BufferType type ) –> Editable.java –> SpannableStringBuilder.java。實際上是將原來的
的CharSequence text擴展成SpannableStringBuilder,以使其具有append等擴展的方法,這兒還有個工廠模式,有時間多讀讀源碼還是不錯的。
第七個看下QuickContactsDemo,首先是QuickContactBadge這個控件,自己看下配置文件。接著是ResourceCursorAdapter,這個adapter繼承在CursorAdapter,它覆寫瞭
CursorAdapter的newView()方法,其實就一句代碼,用Inflater填充指定的xml文件,所以在這個例子的newView()方法中首先調用super().newView()方法,將構造函數中指定的
那個layout轉成view,然後bindView()裡填充數據。最後是個viewHolder緩存layout中的view,viewHolder保證瞭對控件的緩存,減少瞭每次findViewById()的開銷,是優化listview的一個較好的方式。
1 final static class ContactListItemCache {
2         public TextView nameView;
3         public QuickContactBadge photoView;
4         public CharArrayBuffer nameBuffer = new CharArrayBuffer(128);
5  }
6 ContactListItemCache cache = new ContactListItemCache();
7 cache.nameView = (TextView) view.findViewById(R.id.name);
8 cache.photoView = (QuickContactBadge) view.findViewById(R.id.badge);
9 view.setTag(cache);最後那3個activity,一個透明背景activity、一個透明並且模糊不清背景activity、一個用你的壁紙做背景的activity都使用瞭自定義的theme,可以自己看看,放到自己的應用中。

這篇總結先到這,有些亂。

摘自 ZircoN

發佈留言