Setting模块简介

一、Settings涉及的模块

4.0设置的layout有很大的改变。将设置分为四个部分:

WIRELESS & NETWORKS:SIM卡管理,流量使用情况,飞行模式,VPN,网络共享等

DEVICE :情景模式,显示,存储,电池,应用程序

PERSONAL: 账户与同步,位置服务,安全,语言和输入法,备份和重置

SYSTEM: 日期和时间,定时开关及,辅助功能,开发人员选项,关于手机

二、Settings部分的Fragment

public class Settings extends PreferenceActivity{}。因为从3.0中就引入了Fragment机制,所以在Settings里面就只有这一个Acitivity类,而进入里表中的某项设置后,不是进入到新的Activity,而是在原来的Activity上切换了一个UI界面而已。Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容,对不同的界面不再使用不同的Activity。将这些UI面板模块化以便提供给其它Acitivity使用。当然显示的Fragment也会受到当前 Acitivity生命周期影响,而平常的Fragment页有其自己的生命周期。Setting模块典型的使用这个方法,它定义很多独立的fragment然后将这些fragment纳入到SubSettings.java activity中,这样可将要展示的fragment像调用Activity那样般调用。

三、Setting界面的加载

 1.继承关系

Settings.java 是继承PreferenceActivity.java,而referenceActivity.java是继承ListActivity-->Activity

   2. 界面加载

1)加载界面对应的Fragment

a. 实现onBuildHeaders()回调用来指定头文件
调用loadHeadersFromResource()方法对界面进行加载

方法实现:

@Override

public void onBuildHeaders(List<Header> headers) {//fengyaing  11

loadHeadersFromResource(R.xml.settings_headers, headers); //加载header文件

updateHeaderList(headers);//显示列表项删选

}
    b. header放入listview

@Override

public void setListAdapter(ListAdapter adapter) {

if (adapter == null) {

super.setListAdapter(null);

} else {

super.setListAdapter(new HeaderAdapter(this, getHeaders(), mAuthenticatorHelper));//

}

}

c. Settings.java的内部类HeaderAdapter 类介绍

private static class HeaderAdapter extends ArrayAdapter<Header> {

static final int HEADER_TYPE_CATEGORY = 0;

static final int HEADER_TYPE_NORMAL = 1;

static final int HEADER_TYPE_SWITCH = 2;

@Override

public View getView(int position, View convertView, ViewGroup parent) {//加载header列表

HeaderViewHolder holder;

Header header = getItem(position);

int headerType = getHeaderType(header);

View view = null;

if (convertView == null) {

holder = new HeaderViewHolder();

switch (headerType) {

case HEADER_TYPE_CATEGORY:

view = new TextView(getContext(), null,

android.R.attr.listSeparatorTextViewStyle);

holder.title = (TextView) view;

break;

case HEADER_TYPE_SWITCH:

view = mInflater.inflate(R.layout.preference_header_switch_item, parent,

false);

holder.icon = (ImageView) view.findViewById(R.id.icon);

holder.title = (TextView)

view.findViewById(com.android.internal.R.id.title);

holder.summary = (TextView)

view.findViewById(com.android.internal.R.id.summary);

holder.switch_ = (Switch) view.findViewById(R.id.switchWidget);

break;

case HEADER_TYPE_NORMAL:

view = mInflater.inflate(

R.layout.preference_header_item, parent,

false);

holder.icon = (ImageView) view.findViewById(R.id.icon);

holder.title = (TextView)

view.findViewById(com.android.internal.R.id.title);

holder.summary = (TextView)

view.findViewById(com.android.internal.R.id.summary);

break;

}

view.setTag(holder);

} else {

view = convertView;

holder = (HeaderViewHolder) view.getTag();

}

// All view fields must be updated every time, because the view may be recycled

switch (headerType) {

case HEADER_TYPE_CATEGORY:

holder.title.setText(header.getTitle(getContext().getResources()));

break;

case HEADER_TYPE_SWITCH:

// Would need a different treatment if the main menu had more switches

if (header.id == R.id.wifi_settings) {

mWifiEnabler.setSwitch(holder.switch_);

} else {

mBluetoothEnabler.setSwitch(holder.switch_);

}

// No break, fall through on purpose to update common fields

//$FALL-THROUGH$

case HEADER_TYPE_NORMAL:

if (header.extras != null

&& header.extras.containsKey(ManageAccountsSettings.KEY_ACCOUNT_TYPE)) {

String accType = header.extras.getString(

ManageAccountsSettings.KEY_ACCOUNT_TYPE);

ViewGroup.LayoutParams lp = holder.icon.getLayoutParams();

lp.width = getContext().getResources().getDimensionPixelSize(

R.dimen.header_icon_width);

lp.height = lp.width;

holder.icon.setLayoutParams(lp);

Drawable icon = mAuthHelper.getDrawableForType(getContext(), accType);

holder.icon.setImageDrawable(icon);

} else {

holder.icon.setImageResource(header.iconRes);

}

holder.title.setText(header.getTitle(getContext().getResources()));

CharSequence summary = header.getSummary(getContext().getResources());

if (!TextUtils.isEmpty(summary)) {

holder.summary.setVisibility(View.VISIBLE);

holder.summary.setText(summary);

} else {

holder.summary.setVisibility(View.GONE);

}

break;

}

// /M: add for sim management feature

if (header.id == R.id.sim_settings) {

handleDisableHolder(holder, view);

} else {

handleEnableHolder(holder, view);

}

return view;

}}

类的开头就定义了三个常量:这个代表Header的三种类型:
HEADER_TYPE_CATEGORY代表一个分类,它不能点击
HEADER_TYPE_NORMAL代表一个常规项
HEADER_TYPE_SWITCH代表一种开头形式的类型

getView()方法中也是根据三种不同的类型,加载不同的view以及数据,这时Seting类的界面就显示出来。

3.点击事件

1) header的点击事件触发

看onHeaderClick()方法

@Override

public void onHeaderClick(Header header, int position) {

boolean revert = false;

if (header.id == R.id.account_add) {

revert = true;

}

super.onHeaderClick(header, position);//调用父类的方法响应点击事件

if (revert && mLastHeader != null) {

highlightHeader((int) mLastHeader.id);

} else {

mLastHeader = header;

}

}

2)将fragment包裹到继承了Settings.java的SubSettings.java中

@Override

public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,

int titleRes, int shortTitleRes) {

Intent intent = super.onBuildStartFragmentIntent(fragmentName, args,

titleRes, shortTitleRes);//调用父类的方法将fragment包裹到activity中

System.out.println("onBuildStartFragmentIntent3333:"+intent);

// some fragments want to avoid split actionbar

if (DataUsageSummary.class.getName().equals(fragmentName) ||

PowerUsageSummary.class.getName().equals(fragmentName) ||

AccountSyncSettings.class.getName().equals(fragmentName) ||

UserDictionarySettings.class.getName().equals(fragmentName) ||

Memory.class.getName().equals(fragmentName) ||

ManageApplications.class.getName().equals(fragmentName) ||

WirelessSettings.class.getName().equals(fragmentName) ||

PrivacySettings.class.getName().equals(fragmentName) ||

ManageAccountsSettings.class.getName().equals(fragmentName)) {

intent.putExtra(EXTRA_CLEAR_UI_OPTIONS, true);

}

intent.setClass(this, SubSettings.class);

return intent;

}

android Setting模块简介相关推荐

  1. android setting模块,android O版本 设置(Settings)模块总结--设置的一级界面的加载

    O版本的设置界面相对有N有了一些变化,O上面增加了顶级类别的菜单,而之前一些在一级菜单的则移动到了二级界面里面, 如"WIFI","移动网络"等之前是在一级界面 ...

  2. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

  3. 六款值得推荐的Android开源框架简介

    六款值得推荐的Android开源框架简介 技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的"性价比"比较高的Android开源框架,应该是相对实用的. 1.volley ...

  4. Setting 模块之辅助功能

    Setting模块之无障碍(辅助功能) 首先这个辅助功能在AccessibilitySettings类中通过oncreate()方法去加载布局 布局Serverce(SERVICES_CATEGORY ...

  5. android 开发环境ppt,Android开发环境简介.ppt

    Android开发环境简介 1.3 第一个Android应用程序 src目录中存放的是该项目的源文件,所有允许用户修改的java文件和用户自己添加的java文件,都保存在这个目录中. gen目录下的文 ...

  6. Android Camera模块(一)

    Android Camera模块(一) 一.Android Camera架构 1.1 整体架构 架构参考Android Camera简单整理(一)-Camera Android架构(基于Q) goog ...

  7. Android GNSS 模块分析(五)NMEA 协议

    紧接着上一篇<Android GNSS 模块分析(四)HAL 层>,本篇简述下导航硬件设备与卫星导航系统之间的通信协议. NMEA 协议 简介: NMEA(National Marine ...

  8. Android Recovery:功能简介。Recovery模式介绍

    Android Recovery Theory Android Recovery:功能简介 Android支持Recovery模式.在某些操作之后,系统会自动重启并进入到Recovery模式,用户按组 ...

  9. android开发工具简介及下载地址

    AndroidDevTools简介 Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具. ...

最新文章

  1. Markdown使用文档
  2. Python 继承标准类时发生了什么
  3. 一样入职的应届生工资不一样_刘涛入职阿里:为什么阿里要招聘明星?明星入职和普通人一样吗...
  4. 2020年python2停止更新_Python核心团队计划2020年停止支持Python2,NumPy宣布停止支持计划表...
  5. 写lua时需要注意的地方
  6. Kotlin入门(13)类成员的众生相
  7. spark页面单跳转化率
  8. 计算机缺考学校知道吗,计算机二级机考缺考成绩单会不会显示缺考啊
  9. 设置域用户帐户的登录时间
  10. Google 出售 Performics
  11. javascript(定时函数)
  12. 方钢管弹性模量计算方式_弹性模量计算公式.doc
  13. 【张朝阳的物理课笔记】 5. 波动方程,声音在空气中的传播速度
  14. origin | 绘制倒置柱状图 | y轴向下柱状图 | y轴正负对比柱状图 | 添加图层 | 垂线图
  15. 麻将牌型说明最全版(图文介绍)
  16. Linux监控系统之Zabbix
  17. 揭开人创造思维之谜:浴缸和床最易引发灵感
  18. python公立,农历转换
  19. 寫一個智能聊天機器人
  20. docker容器内的attached 和detached模式

热门文章

  1. M-ADDA: Unsupervised Domain Adaptation with Deep Metric Learning
  2. 正益移动荣获“中国能源企业信息化产品技术创新奖”
  3. 华为5gcpe虚拟服务器,华为移动路由5G CPE Pro真实评测 感受5G之美
  4. Araneid 蜘蛛纸牌游戏源代码 (转)
  5. ADC(模数转换)详解
  6. Base-深圳/上海,软件架构师
  7. 显著性目标检测之Global Context-Aware Progressive Aggregation Network for Salient Object Detection
  8. 2021-03-25 Python初级Day02
  9. 【07节】Python3+Selenium4自动化 unittest 测试框架详解
  10. C语言问题%f vs %lf,%d vs %ld