API Demos_App/Activity
此篇来看下App/Activity下的demos。
第一个Animation,展示了从一个activity启动另一个activity时的两种动画效果,主要是这个方法:
1 overridePendingTransition(int enterAnim, int exitAnim)
这个方法跟在startActivity()或者finish()之后调用来指定一个效果,第一个参数是下一个activity出现的效果,第二个参数是该activity退出的效果。
关于animation,可以参考这篇文章:http://www.zzzyk.com/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,可以看下这篇文章:http://www.zzzyk.com/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()这个方法,关于这个方法,
网上有很多介绍,大家可以自己搜一下,给个参考文章:http://www.zzzyk.com/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)这个方法,可以参考这篇文章:http://www.zzzyk.com/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
补充:移动开发 , Android ,