zoukankan      html  css  js  c++  java
  • android设置中的Preferencescreen使用方法介绍与分析

    今天主要研究了一下设置中的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是project的包名,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。

  • 相关阅读:
    dell台式机网络唤醒
    今天学习到ROS的PCC的新的一种场景,用PCC不是为了带宽叠加而是为了换IP,PCC的标准做法
    默认ros安装好以后,可能对外开放的端口号,可能被黑客利用的地方,ros的0day漏洞
    ros-winbox利用防火墙安全登录,二次碰撞方法
    S5120V2-IRF2配置
    routeros ros mikrotik的ipsec配置,注意配置的步骤,以及哪些硬件支持哪种加速
    60岁-80岁老年人住院医疗险,既往症可理赔!家有长辈首选
    docker上2分钟安装mikrotik routeros
    pandas filter数据筛选
    (纪录片)光的故事 BBC Light Fantastic (2004)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3993531.html
Copyright © 2011-2022 走看看