目前Android手机上的应用,大部分都带有设置功能,即在里面选择一些本应用的自定义设置,便于用户的定制化。
但如果自己写一个Activity来实现,未免过于复杂,而且浪费时间。
Android框架已经为我们提供了一个简单的方式来实现设置页面,即使用PreferenceActivity。
首先,在res/xml下新建一个preference.xml文件,用于定义首选项页面的布局。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="PreferenceCategory 1"> <CheckBoxPreference android:key="CheckBox1" android:title="CheckBox" android:summaryOn="某功能: 开启" android:summaryOff="某功能: 关闭" android:defaultValue="true" /> </PreferenceCategory> <PreferenceCategory android:title="PreferenceCategory 3"> <ListPreference android:key="ListPreference" android:title="ListPreference" android:summary="ListPreference测试" android:dialogTitle="ListPreference" android:entries="@array/entries_list_preference" android:entryValues="@array/entriesvalue_list_preference" /> <EditTextPreference android:key="EditTextPreference" android:title="EditTextPreference" android:summary="点击输入" android:dialogTitle="输入设置" /> <RingtonePreference android:key="RingtonePreference" android:title="RingtonePreference" android:summary="选择铃声" /> </PreferenceCategory> </PreferenceScreen>
通用属性:
title:第一张图中的”删除旧信息”、”短信设置”
key:用于检索该首选项,可以在代码中利用PreferenceManager.getDefaultSharedPreferences(context).getXXX(key,valueNotExist)方法获得该首选项的值。也可以利用PreferenceActivity的getPreference(key)获取该Preference对象,进而设置相应的值。
defaultValue:默认值,当继承了PreferenceActivity的页面打开时,通常会在onCreate中调用addPreferencesFromResource方法加载首选项。此时,若设置了defaultValue,且之前未设置过该项的值,系统会自动将其设为defaultValue,并写入该应用的首选项文件中。这样,若要实现一键恢复默认值,只要调用addPreferencesFromResource即可。
summary:第一张图中”达到数量上限时删除旧信息”
dependency:其余Preference的key(通常为某个CheckBoxPreference的),若设置了该项,当依赖项选中时才可以设置本项。
persistent:为true时,系统会帮助我们去保存该设置。默认为true。
标签:
PreferenceScreen:设置页面,可嵌套形成二级设置页面,用Title参数设置标题。目前没怎么用过,以后用到再补充。
PreferenceCategory是一个首选项组,通常把一类的设置项用一个PreferenceCategory包起来。如下图中的存储设置所示。
CheckBoxPreference就是选择框,只有两种值,true或false,可用Title参数设置标题,用summaryOn和summaryOff参数来设置控件选中和未选中时的提示。
ListPreference:下拉框选择控件,用Title参数设置标题,用Summary参数设置说明,点击后出现下拉框,效果如下图所示。用dialogTitle设置下拉框的标题,下拉框内显示的内容和具体的值需要在res/values/array.xml(可以是自定义的文件,建议单独建一个来存储字符串数组)中设置两个array来表示,在preference.xml中用android:entries指定显示内容的id,android:entryValues指定相应内容的值的id。如下图所示。
<string-array name="entries_list_preference"> <item>始终</item> <item>仅在静音时</item> <item>一律不</item> </string-array> <string-array name="entriesvalue_list_preference"> <item>1</item> <item>2</item> <item>3</item> </string-array>
注:当你的应用要支持多语言时,建议将entryValues对应的数组中的值用数字表示,这样就可以很好的避免翻译时不小心把值也给改了,造成不同语言切换时,丢失之前的设置(比如说在中文对应的文件里,用值_始终表示,而在英文文件中却是value_always。这样当从中文切换到英文时,因为之前在preference文件中存的是值_始终,在英文情况下,系统无法找到值_始终对应的显示内容,就会造成打开该ListPreference时没有选项被选中)。
RingtonePreference:铃声选择框,点击后可选择系统铃声。Title参数设置标题,Summary参数设置说明,dialogTitle参数设置铃声选择框的标题。
EditTextPreference:输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。
以上这几种Preference,当你对其中的值修改后,系统都会自动将其存入data\data\你的包名\shared_prefs\ 下的preferences文件中(具体起名规则目前还没搞懂,不过一看就知道是哪个文件)。然后每次PreferenceActivity启动时,都会通过addPreferencesFromResource来加载。如果没有对应的值,则设为默认值。如果没有默认值,则不设置。
当然,很多情况下,以上提供的几种往往不能满足我们的需求,这就需要对首选项进行自定义。可以自己实现一个继承自Preference的类,也可以使用默认的Preference,然后对它的点击进行一些处理,如弹出自定义对话框,转到自定义的Activity等等。
建好了preference.xml,就可以新建一个类,继承PreferenceActivity。
在onCreate中可以加一些自定义Preference的初始化代码,调用addPreferencesFromResource来加载preference.xml文件。
在onPreferenceTreeClick中判断点击的是哪个Preference。并进行一些自定义的操作,如弹出自定义的窗口。最后记得调用super. onPreferenceTreeClick。
public class MyPreferenceActivity extends PreferenceActivity{ /** Called when the activity is first created. */ CheckBoxPreference checkbox; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference); checkbox=(CheckBoxPreference) findPreference("CheckBox1"); } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if(preference==checkbox) //做一些自定义的事 ; return super.onPreferenceTreeClick(preferenceScreen, preference); } }
NSStringFormClass 这个不用说,看命名都应该知道吧。
NSClassFromString 将NSString转换成一个Class,如果不存在,返回一个nil。
正常来说,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
比如在iPhone中,NSTask可能就会出现这种情况,所以在你需要使用NSTask时,最好使用:
[[NSClassFromString(@"NSTask") .....]]
而不要直接使用[NSTask ...]这种写法。
NSClassFromString的好处是:
1 弱化连接,因此并不会把没有的Framework也link到程序中。
2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。
同样的,还可以通过一个方法名字来得到一个Selector,然后就可以动态的调用这个Selector了,在Obj-c里面,一切都是动态的。
类似的函数如下:
NSClassFromString
NSGetSizeAndAlignment
NSLog
NSLogv
NSSelectorFromString
NSStringFromClass
NSStringFromSelector
1、抽象类中可以定义域(成员变量),普通方法,抽象方法
public abstract class TestA { int num = 0;//域(成员变量) public void add(){//普通方法 System.out.println("加法"); } abstract int get();//抽象方法 }
2、非抽象子类继承抽象父类时,必须要重写抽象父类中的所有抽象方法(普通方法不用)
class TestB extends TestA{ @Override public int get() {//子类重写的方法,可以修改父类的权限(父默认权限->子public) return 0; } }
3、抽象子类可以空继承抽象父类,不一定要重写抽象父类的方法
abstract class TestC extends TestA{ //抽象子类不用重写抽象父类的方法 }
4、抽象类可以实现(implements)多个接口;接口可以继承多个接口
interface infA{ } interface infB{ } interface infC extends infA,infB{//接口继承多个接口 } abstract class TestD implements infA,infB{//抽象类实现多个接口 }