做优惠券网站赚钱吗,建设一个网站需要哪些人员参与,做网站php软件,35岁学设计晚不晚简介
Settings应用中#xff0c;提供多类设置菜单入口#xff0c;每个菜单内又有各模块功能的实现。
那么各个模块基于Settings 基础的界面Fragment去实现UI#xff0c;层层按不同业务进行封装继承实现子类#xff1a;
DashboardFragmentSettingsPreferenceFragment
功…简介
Settings应用中提供多类设置菜单入口每个菜单内又有各模块功能的实现。
那么各个模块基于Settings 基础的界面Fragment去实现UI层层按不同业务进行封装继承实现子类
DashboardFragmentSettingsPreferenceFragment
功能设置页中的菜单又是通过Controller去实现业务并进行UI动态更新控制。 代码
基于 Android U 平台的实现进行介绍。
公用基类
DashboardFragment
packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
package com.android.settings.dashboard;/*** Base fragment for dashboard style UI containing a list of static and dynamic setting items.*/
public abstract class DashboardFragment extends SettingsPreferenceFragmentimplements CategoryListener, Indexable, PreferenceGroup.OnExpandButtonClickListener,BasePreferenceController.UiBlockListener {public static final String CATEGORY category;private static final String TAG DashboardFragment;private static final long TIMEOUT_MILLIS 50L;/*** Get a list of {link AbstractPreferenceController} for this fragment.*/protected ListAbstractPreferenceController createPreferenceControllers(Context context) {return null;} 模块案例
继承关系自上而下底层是父类除了MobileNetwork其他都是抽象类直到Fragment
MobileNetworkSettings --- 移动网络设置AbstractMobileNetworkSettingsRestrictedDashboardFragmentDashboardFragmentSettingsPreferenceFragmentInstrumentedPreferenceFragment -- /com/android/settings/core/ObservablePreferenceFragment -- /frameworks/base/packages/SettingsLibPreferenceFragmentCompat -- classes.jar/androidx.preferenceFragment AbstractMobileNetworkSettings 是一个抽象类用于提供移动网络设置相关的基本功能和行为。 RestrictedDashboardFragment 是在DashboardFragment的基础上添加了一些限制或额外的安全措施以限制用户对某些设置或操作的访问或更改。可能会对一些敏感的设置进行限制例如网络设置、安全设置等。也可能会对某些功能进行权限控制只允许特定用户访问。 DashboardFragment 是基础的仪表盘样式 UI Fragment用于显示静态和动态的设置项列表。通常不会加入对设置的限制而是专注于提供用户友好的设置界面和功能。可能包含一些基本的设置项处理和展示逻辑以便用户能够轻松地进行配置和操作。 MobileNetworkSettings 移动网络设置界面逻辑
packages/apps/Settings/src/com/android/settings/network/telephony/MobileNetworkSettings.java
界面布局在mobile_network_settings.xml
MobileNetworkSettings API APIFunctiononPreferenceTreeClick定义子功能pref点击事件overridecreatePreferenceControllers创建子功能pref的控制器overrideonAttach生命周期use 各类 ControlleroverrideonSubscriptionDetailChanged响应注册状态变化进行的操作 package com.android.settings.network.telephony;SearchIndexable(forTarget SearchIndexable.ALL ~SearchIndexable.ARC)
public class MobileNetworkSettings extends AbstractMobileNetworkSettings implementsMobileNetworkRepository.MobileNetworkCallback {private static final String LOG_TAG NetworkSettings;//处理子菜单点击事件/*** Invoked on each preference click in this hierarchy, overrides* PreferenceActivitys implementation. Used to make sure we track the* preference click events.*/Overridepublic boolean onPreferenceTreeClick(Preference preference) {if (super.onPreferenceTreeClick(preference)) {return true;}final String key preference.getKey();if (TextUtils.equals(key, BUTTON_CDMA_SYSTEM_SELECT_KEY)|| TextUtils.equals(key, BUTTON_CDMA_SUBSCRIPTION_KEY)) {if (mTelephonyManager.getEmergencyCallbackMode()) {startActivityForResult(new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),REQUEST_CODE_EXIT_ECM);mClickedPrefKey key;}return true;}//【客制化】可通过else if 定制其他keyt的点击行为return false;}//创建各子菜单/功能选项的ControllerOverrideprotected ListAbstractPreferenceController createPreferenceControllers(Context context) {if (!SubscriptionUtil.isSimHardwareVisible(context)) {finish();return Arrays.asList();}if (getArguments() null) {Intent intent getIntent();if (intent ! null) {mSubId intent.getIntExtra(Settings.EXTRA_SUB_ID,MobileNetworkUtils.getSearchableSubscriptionId(context));Log.d(LOG_TAG, display subId from intent: mSubId);} else {Log.d(LOG_TAG, intent is null, can not get subId mSubId from intent.);}} else {mSubId getArguments().getInt(Settings.EXTRA_SUB_ID,MobileNetworkUtils.getSearchableSubscriptionId(context));Log.d(LOG_TAG, display subId from getArguments(): mSubId);}mMobileNetworkRepository MobileNetworkRepository.getInstance(context);mExecutor.execute(() - {mSubscriptionInfoEntity mMobileNetworkRepository.getSubInfoById(String.valueOf(mSubId));mMobileNetworkInfoEntity mMobileNetworkRepository.queryMobileNetworkInfoBySubId(String.valueOf(mSubId));});return Arrays.asList(new DataUsageSummaryPreferenceController(getActivity(), getSettingsLifecycle(),this, mSubId),new RoamingPreferenceController(context, KEY_ROAMING_PREF, getSettingsLifecycle(),this, mSubId),new CallsDefaultSubscriptionController(context, KEY_CALLS_PREF,getSettingsLifecycle(), this),new SmsDefaultSubscriptionController(context, KEY_SMS_PREF, getSettingsLifecycle(),this),new MobileDataPreferenceController(context, KEY_MOBILE_DATA_PREF,getSettingsLifecycle(), this, mSubId),new ConvertToEsimPreferenceController(context, KEY_CONVERT_TO_ESIM_PREF,getSettingsLifecycle(), this, mSubId));}Overridepublic void onAttach(Context context) {super.onAttach(context);if (mSubId SubscriptionManager.INVALID_SUBSCRIPTION_ID) {Log.d(LOG_TAG, Invalid subId, get the default subscription to show.);SubscriptionInfo info SubscriptionUtil.getSubscriptionOrDefault(context, mSubId);if (info null) {Log.d(LOG_TAG, Invalid subId request mSubId);return;}mSubId info.getSubscriptionId();Log.d(LOG_TAG, Show NetworkSettings fragment for subId mSubId);}Intent intent getIntent();if (intent ! null) {int updateSubscriptionIndex intent.getIntExtra(Settings.EXTRA_SUB_ID,SubscriptionManager.INVALID_SUBSCRIPTION_ID);if (updateSubscriptionIndex ! SubscriptionManager.INVALID_SUBSCRIPTION_ID) {int oldSubId mSubId;mSubId updateSubscriptionIndex;// If the subscription has changed or the new intent does not contain the opt in// action,// remove the old discovery dialog. If the activity is being recreated, we will see// onCreate - onNewIntent, so the dialog will first be recreated for the old// subscription// and then removed.if (updateSubscriptionIndex ! oldSubId|| !MobileNetworkActivity.doesIntentContainOptInAction(intent)) {removeContactDiscoveryDialog(oldSubId);}// evaluate showing the new discovery dialog if this intent contains an action to// show the// opt-in.if (MobileNetworkActivity.doesIntentContainOptInAction(intent)) {showContactDiscoveryDialog();}}}final DataUsageSummaryPreferenceController dataUsageSummaryPreferenceController use(DataUsageSummaryPreferenceController.class);if (dataUsageSummaryPreferenceController ! null) {dataUsageSummaryPreferenceController.init(mSubId);}use(MobileNetworkSwitchController.class).init(mSubId);use(CarrierSettingsVersionPreferenceController.class).init(mSubId);use(BillingCyclePreferenceController.class).init(mSubId);use(MmsMessagePreferenceController.class).init(mSubId);use(AutoDataSwitchPreferenceController.class).init(mSubId);use(DisabledSubscriptionController.class).init(mSubId);use(DeleteSimProfilePreferenceController.class).init(mSubId, this,REQUEST_CODE_DELETE_SUBSCRIPTION);use(DisableSimFooterPreferenceController.class).init(mSubId);use(NrDisabledInDsdsFooterPreferenceController.class).init(mSubId);final MobileDataPreferenceController mobileDataPreferenceController use(MobileDataPreferenceController.class);if (mobileDataPreferenceController ! null) {mobileDataPreferenceController.init(getFragmentManager(), mSubId,mSubscriptionInfoEntity, mMobileNetworkInfoEntity);mobileDataPreferenceController.setWifiPickerTrackerHelper(new WifiPickerTrackerHelper(getSettingsLifecycle(), context,null /* WifiPickerTrackerCallback */));}final RoamingPreferenceController roamingPreferenceController use(RoamingPreferenceController.class);if (roamingPreferenceController ! null) {roamingPreferenceController.init(getFragmentManager(), mSubId,mMobileNetworkInfoEntity);}use(ApnPreferenceController.class).init(mSubId);use(CarrierPreferenceController.class).init(mSubId);use(DataUsagePreferenceController.class).init(mSubId);use(PreferredNetworkModePreferenceController.class).init(mSubId);use(EnabledNetworkModePreferenceController.class).init(mSubId);use(DataServiceSetupPreferenceController.class).init(mSubId);use(Enable2gPreferenceController.class).init(mSubId);use(CarrierWifiTogglePreferenceController.class).init(getLifecycle(), mSubId);final WifiCallingPreferenceController wifiCallingPreferenceController use(WifiCallingPreferenceController.class).init(mSubId);final OpenNetworkSelectPagePreferenceController openNetworkSelectPagePreferenceController use(OpenNetworkSelectPagePreferenceController.class).init(mSubId);final AutoSelectPreferenceController autoSelectPreferenceController use(AutoSelectPreferenceController.class).init(getLifecycle(), mSubId).addListener(openNetworkSelectPagePreferenceController);use(NetworkPreferenceCategoryController.class).init(mSubId).setChildren(Arrays.asList(autoSelectPreferenceController));mCdmaSystemSelectPreferenceController use(CdmaSystemSelectPreferenceController.class);mCdmaSystemSelectPreferenceController.init(getPreferenceManager(), mSubId);mCdmaSubscriptionPreferenceController use(CdmaSubscriptionPreferenceController.class);mCdmaSubscriptionPreferenceController.init(getPreferenceManager(), mSubId);final VideoCallingPreferenceController videoCallingPreferenceController use(VideoCallingPreferenceController.class).init(mSubId);use(CallingPreferenceCategoryController.class).setChildren(Arrays.asList(wifiCallingPreferenceController, videoCallingPreferenceController));use(Enhanced4gLtePreferenceController.class).init(mSubId).addListener(videoCallingPreferenceController);use(Enhanced4gCallingPreferenceController.class).init(mSubId).addListener(videoCallingPreferenceController);use(Enhanced4gAdvancedCallingPreferenceController.class).init(mSubId).addListener(videoCallingPreferenceController);use(ContactDiscoveryPreferenceController.class).init(getParentFragmentManager(), mSubId);use(NrAdvancedCallingPreferenceController.class).init(mSubId);use(TransferEsimPreferenceController.class).init(mSubId, mSubscriptionInfoEntity);final ConvertToEsimPreferenceController convertToEsimPreferenceController use(ConvertToEsimPreferenceController.class);if (convertToEsimPreferenceController ! null) {convertToEsimPreferenceController.init(mSubId, mSubscriptionInfoEntity);}ListAbstractSubscriptionPreferenceController subscriptionPreferenceControllers useAll(AbstractSubscriptionPreferenceController.class);for (AbstractSubscriptionPreferenceController controller :subscriptionPreferenceControllers) {controller.init(mSubId);}}private void onSubscriptionDetailChanged() {if (mSubscriptionInfoEntity ! null) {/*** Update the title when SIM stats got changed*/final ConsumerActivity renameTitle activity - {if (activity ! null !activity.isFinishing()) {if (activity instanceof SettingsActivity) {((SettingsActivity) activity).setTitle(mSubscriptionInfoEntity.uniqueName);}}};ThreadUtils.postOnMainThread(() - {renameTitle.accept(getActivity());redrawPreferenceControllers();});}}//界面布局在mobile_network_settings.xmlOverrideprotected int getPreferenceScreenResId() {return R.xml.mobile_network_settings;}} mobile_network_settings 布局 packages/apps/Settings/res/xml/mobile_network_settings.xml
MobileNetworkSwitchController SIM卡移动网络总开关逻辑use_sim_switch 界面的资源keymobile_network_use_sim_on 开关名称title 以下仅展示部分功能选项/菜单
PreferenceScreenxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:settingshttp://schemas.android.com/apk/res-autoandroid:keymobile_network_pref_screencom.android.settings.widget.SettingsMainSwitchPreferenceandroid:keyuse_sim_switchandroid:titlestring/mobile_network_use_sim_onsettings:controllercom.android.settings.network.telephony.MobileNetworkSwitchController/PreferenceCategoryandroid:keyenabled_state_containerandroid:titlestring/summary_placeholdersettings:controllercom.android.settings.network.telephony.DisabledSubscriptionControllerandroid:layoutlayout/preference_category_no_label!--智能数据切换开关--SwitchPreferenceandroid:keyauto_data_switchandroid:titlestring/auto_data_switch_titleandroid:summarystring/auto_data_switch_summarysettings:controllercom.android.settings.network.telephony.AutoDataSwitchPreferenceController/!--数据漫游开关--com.android.settingslib.RestrictedSwitchPreferenceandroid:keybutton_roaming_keyandroid:titlestring/roamingandroid:persistentfalseandroid:summaryOnstring/roaming_enableandroid:summaryOffstring/roaming_disablesettings:userRestrictionno_data_roamingsettings:controllercom.android.settings.network.telephony.RoamingPreferenceController/!--数据流量菜单入口--Preferenceandroid:keydata_usage_summaryandroid:titlestring/mobile_data_usage_titlesettings:controllercom.android.settings.network.telephony.DataUsagePreferenceController/!--网络模式列表选择--ListPreferenceandroid:keyenabled_networks_keyandroid:titlestring/preferred_network_mode_titleandroid:summarystring/preferred_network_mode_summaryandroid:entriesarray/enabled_networks_choicesandroid:entryValuesarray/enabled_networks_valuesandroid:dialogTitlestring/preferred_network_mode_dialogtitlesettings:controllercom.android.settings.network.telephony.EnabledNetworkModePreferenceController/!--Network目录--PreferenceCategoryandroid:keynetwork_operators_category_keyandroid:titlestring/network_operator_categorysettings:controllercom.android.settings.network.telephony.NetworkPreferenceCategoryController!--自动选网开关--SwitchPreferenceandroid:keyauto_select_keyandroid:titlestring/select_automaticallysettings:controllercom.android.settings.network.telephony.gsm.AutoSelectPreferenceController/!--如果上述自动选网关闭那么此手动选网菜单可跳转到网络列表页--Preferenceandroid:keychoose_network_keyandroid:titlestring/choose_network_titlesettings:controllercom.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenceController//PreferenceCategory!--APN设置入口--!--We want separate APN setting from reset of settings because we want user to change it with caution--com.android.settingslib.RestrictedPreferenceandroid:keytelephony_apn_keyandroid:persistentfalseandroid:titlestring/mobile_network_apn_titlesettings:allowDividerAbovetruesettings:keywordsstring/keywords_access_point_namessettings:controllercom.android.settings.network.telephony.ApnPreferenceController//PreferenceCategory/PreferenceScreen