android Setting模块简介
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模块简介相关推荐
- android setting模块,android O版本 设置(Settings)模块总结--设置的一级界面的加载
O版本的设置界面相对有N有了一些变化,O上面增加了顶级类别的菜单,而之前一些在一级菜单的则移动到了二级界面里面, 如"WIFI","移动网络"等之前是在一级界面 ...
- 【Android 系统开发】 Android 系统启动流程简介
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...
- 六款值得推荐的Android开源框架简介
六款值得推荐的Android开源框架简介 技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的"性价比"比较高的Android开源框架,应该是相对实用的. 1.volley ...
- Setting 模块之辅助功能
Setting模块之无障碍(辅助功能) 首先这个辅助功能在AccessibilitySettings类中通过oncreate()方法去加载布局 布局Serverce(SERVICES_CATEGORY ...
- android 开发环境ppt,Android开发环境简介.ppt
Android开发环境简介 1.3 第一个Android应用程序 src目录中存放的是该项目的源文件,所有允许用户修改的java文件和用户自己添加的java文件,都保存在这个目录中. gen目录下的文 ...
- Android Camera模块(一)
Android Camera模块(一) 一.Android Camera架构 1.1 整体架构 架构参考Android Camera简单整理(一)-Camera Android架构(基于Q) goog ...
- Android GNSS 模块分析(五)NMEA 协议
紧接着上一篇<Android GNSS 模块分析(四)HAL 层>,本篇简述下导航硬件设备与卫星导航系统之间的通信协议. NMEA 协议 简介: NMEA(National Marine ...
- Android Recovery:功能简介。Recovery模式介绍
Android Recovery Theory Android Recovery:功能简介 Android支持Recovery模式.在某些操作之后,系统会自动重启并进入到Recovery模式,用户按组 ...
- android开发工具简介及下载地址
AndroidDevTools简介 Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具. ...
最新文章
- Markdown使用文档
- Python 继承标准类时发生了什么
- 一样入职的应届生工资不一样_刘涛入职阿里:为什么阿里要招聘明星?明星入职和普通人一样吗...
- 2020年python2停止更新_Python核心团队计划2020年停止支持Python2,NumPy宣布停止支持计划表...
- 写lua时需要注意的地方
- Kotlin入门(13)类成员的众生相
- spark页面单跳转化率
- 计算机缺考学校知道吗,计算机二级机考缺考成绩单会不会显示缺考啊
- 设置域用户帐户的登录时间
- Google 出售 Performics
- javascript(定时函数)
- 方钢管弹性模量计算方式_弹性模量计算公式.doc
- 【张朝阳的物理课笔记】 5. 波动方程,声音在空气中的传播速度
- origin | 绘制倒置柱状图 | y轴向下柱状图 | y轴正负对比柱状图 | 添加图层 | 垂线图
- 麻将牌型说明最全版(图文介绍)
- Linux监控系统之Zabbix
- 揭开人创造思维之谜:浴缸和床最易引发灵感
- python公立,农历转换
- 寫一個智能聊天機器人
- docker容器内的attached 和detached模式
热门文章
- M-ADDA: Unsupervised Domain Adaptation with Deep Metric Learning
- 正益移动荣获“中国能源企业信息化产品技术创新奖”
- 华为5gcpe虚拟服务器,华为移动路由5G CPE Pro真实评测 感受5G之美
- Araneid 蜘蛛纸牌游戏源代码 (转)
- ADC(模数转换)详解
- Base-深圳/上海,软件架构师
- 显著性目标检测之Global Context-Aware Progressive Aggregation Network for Salient Object Detection
- 2021-03-25 Python初级Day02
- 【07节】Python3+Selenium4自动化 unittest 测试框架详解
- C语言问题%f vs %lf,%d vs %ld