今天主要研究了一下设置中的Preferencescreen应用,它不仅可以作为设置界面显示,而且还能够启动activity,下面主要是对启动activity的介绍
1. Preferencescreen中启动activity
例如wireless_setting.xml中有如下片段

<PreferenceScreen xmlns:Android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/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。
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-10/45204.htm

更多相关文章

  1. Android(安卓)开机自动启动服务
  2. apk、dex、odex梳理
  3. Android(安卓)系统启动流程总结
  4. Android(安卓)--启动画面制做 png图片-->initlogo.rle
  5. Android(安卓)去除“Viewing full screen”弹窗
  6. Android(安卓)7.0拍照后保存到手机的指定目录并返回显示
  7. ConnectivityManager详解
  8. 图解Android(安卓)- Zygote, System Server 启动分析
  9. laravel使用Dingo\Api通过response()->json()返回空对象

随机推荐

  1. 2013 android经典实例及赚钱心得
  2. XMPP协议实现原理介绍
  3. Android周学习Step By Step(5)--常用widget
  4. 深入浅出 - Android系统移植与平台开发(六
  5. Android 三大图片缓存原理、特性对比
  6. Android调用系统相机、自定义相机、处理
  7. Mika Mobile 谈论 Android 游戏开发:一个
  8. 一些优秀的 Android 开发专栏推荐
  9. Android SDK 2.3与Eclipse开发环境搭建
  10. 从零开始--系统深入学习android(实践-让我