设置中的Preferencescreen不仅可以作为设置界面显示,而且还能够启动activity,下面主要是对启动activity的介绍 1. Preferencescreen中启动activity 例如wireless_setting.xml中有如下片段
<PreferenceScreen xmlns:android="http://schemas./apk/res/android" xmlns:settings="http://schemas./apk/res/com.seedshope.android"> <PreferenceScreen android:key="wifi_settings" android:title="@string/wifi_settings" android:summary="@string/wifi_settings_summary" > <intent android:action="android.intent.action.MAIN" android:targetPackage="com.android.settings" android:targetClass="com.android.settings.wifi.WifiSettings" /> </PreferenceScreen> </PreferenceScreen>
其中com.android.settings是工程的包名,com.android.settings.wifi.WifiSettings是要启动的类。 一般情况下,这样就ok了,点击对应的Preference就能够启动对应的activity,然而仅仅这样有时这样,并不一定能够启动对应的activity,因为它与回调函数onPreferenceTreeClick有关,有时候我们会重写这个方法如: public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if ( (preference == mAirplaneModePreference) && (Boolean.parseBoolean( SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) ) { // In ECM mode launch ECM app dialog startActivityForResult( new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null), REQUEST_CODE_EXIT_ECM); return true; } else { // Let the intents be launched by the Preference manager return false; } } 其中WirelessSetting.java中有如上函数,当返回值为true时,你怎么点击Preference都不会跳转到activity的,只有等到它的返回值为false的时候,才可以正常跳转,因为点击某一个Preference的真正实现在Preference.java的performClick函数中如下: void performClick(PreferenceScreen preferenceScreen) { if (!isEnabled()) { return; } onClick(); if (mOnClickListener != null && mOnClickListener.onPreferenceClick(this)) { return; } PreferenceManager preferenceManager = getPreferenceManager(); if (preferenceManager != null) { PreferenceManager.OnPreferenceTreeClickListener listener = preferenceManager .getOnPreferenceTreeClickListener(); if (preferenceScreen != null && listener != null && listener.onPreferenceTreeClick(preferenceScreen, this)) { return; } } if (mIntent != null) { Context context = getContext(); context.startActivity(mIntent); } } 当点击某个Preference时的调用流程是AdapterView.performItemClick--》PreferenceScreen.onItemClick--》Preference.performClick--》PreferenceActivity.onPreferenceTreeClick,当onPreferenceTreeClick返回true的时候就直接return了,没有走下面启动activity的地方了,因此要使一个Preference能够正常跳转到另外一个activity有两个条件,一是xml里面是否设置正确,第二是调用该xml的java类是否在onPreferenceTreeClick这个函数需要返回false。
|