API Demos_App/Activity
此篇來看下App/Activity下的demos。第一個Animation,展示了從一個activity啟動另一個activity時的兩種動畫效果,主要是這個方法:
1 overridePendingTransition(int enterAnim, int exitAnim)
startActivity()或者finish()之后調用來指定一個效果
,第一個參數是下一個activity出現的效果,第二個參數是該activity退出的效果。關于animation,可以參考這篇文章:http://www.cnblogs.com/feisky/archive/2010/01/11/1644482.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中:2 <item name="android:windowBackground">@drawable/filled_box</item>
3 </style>
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,可以看下這篇文章:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6087.html。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>
這兒分享一個展現漸變色背景的方法,除了ps一張漸變色的圖片,也可以使用shape,將上面代碼的<solid>標簽替換成<gradient>代表漸變:
1 <gradient
2 android:startColor="#52adcd"
3 android:endColor="#1c87b1"
4 android:angle="0" /> <!- angle代表角度,0就是從左往右漸變,可以多用幾個值試一試 。這個標簽不能和solid標簽同時出現。-!>
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);
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()這個方法,關于這個方法,
網上有很多介紹,大家可以自己搜一下,給個參考文章:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html。
第五個看下PersistentState和SaveRestoreState,先說SaveRestoreState展示了
再說下PersistentState,這個展示了使用SharedPreferences持久化的保存edittext的狀態,包括光標的位置。主要是在onPause()里保存,onResume()里還原,
不多說了,測試這兩個例子時,可以修改兩個edittext中的值然后旋轉手機,使其橫屏,這樣那個activity會destory然后再create。
第六個看下ReceiveResult,主要展示了startActivityForResult()的用法,這個可以用于比如從一個activity跳到另一個activity去選擇一個email地址或是一張圖片,
選擇完畢時結果再返回給上一個activity。我按照流程來介紹下這個方法的用法,
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這個例子,加強對
還有個知識點說下,在receiveResult的onCreate()中,mResults.setText(mResults.getText(), TextView.BufferType.EDITABLE);關于
是系統自己的dialog theme:@android:style/Theme.Dialog,其次跟第三個實例類似,也使用了requestWindowFeature()這個方法,關于這個方法,
網上有很多介紹,大家可以自己搜一下,給個參考文章:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.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)這個方法,可以參考這篇文章:http://litonggang.iteye.com/blog/507200
最好結合源碼來看這個方法,從TextView的setText( CharSequence text, BufferType type ) --> Editable.java --> SpannableStringBuilder.java。實際上是將原來的
最好結合源碼來看這個方法,從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);
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,可以自己看看,放到自己的應用中。
這篇總結先到這,有些亂。
posted on 2012-02-24 15:32 ZircoN 閱讀(1241) 評論(0) 編輯 收藏 所屬分類: Android ApiDemos