Android Studio为开发者提供了很多内建的Activity, 其中Settings Activity是非常有用且功能强大的一种内建Activity.

Setting Activity其实本质上是从PreferenceActivity中继承过来的。使用Setting Activity后,完全不需要自己控制Preferences的读写,PreferenceActivity会帮我们处理一切。

PreferenceActivity和普通的Activity不同,它不再使用普通的界面布局文件,而是使用选项设置的布局文件。选项设置的布局文件以PreferenceScreen作为根元素,每一个PreferenceScreen对应后台的一个PreferenceFragment。

使用Android Studio添加一个Activity,会默认帮我们生成一个Pref_header.xml文件和若干个Pref*.xml文件。对应到Activity里,需要对应定义几个PreferenceFragment和重写onBuildHeaders方法用于载入定义在Pref_header.xml中的入口布局。

相应的代码片段如下

Pref_header.xml

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"><!-- These settings headers are only used on tablets. --><headerandroid:fragment="com.example.xpshen.myapplication.SettingsActivity$GeneralPreferenceFragment"android:icon="@drawable/ic_info_black_24dp"android:title="@string/pref_header_general" /><headerandroid:fragment="com.example.xpshen.myapplication.SettingsActivity$NotificationPreferenceFragment"android:icon="@drawable/ic_notifications_black_24dp"android:title="@string/pref_header_notifications" /><headerandroid:fragment="com.example.xpshen.myapplication.SettingsActivity$DataSyncPreferenceFragment"android:icon="@drawable/ic_sync_black_24dp"android:title="@string/pref_header_data_sync" /></preference-headers>

Pref_general.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><SwitchPreferenceandroid:defaultValue="true"android:key="example_switch"android:summary="@string/pref_description_social_recommendations"android:title="@string/pref_title_social_recommendations" /><!-- NOTE: EditTextPreference accepts EditText attributes. --><!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. --><EditTextPreferenceandroid:capitalize="words"android:defaultValue="@string/pref_default_display_name"android:inputType="textCapWords"android:key="example_text"android:maxLines="1"android:selectAllOnFocus="true"android:singleLine="true"android:title="@string/pref_title_display_name" /><!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog todismiss it. --><!-- NOTE: ListPreference's summary should be set to its value by the activity code. --><ListPreferenceandroid:defaultValue="-1"android:entries="@array/pref_example_list_titles"android:entryValues="@array/pref_example_list_values"android:key="example_list"android:negativeButtonText="@null"android:positiveButtonText="@null"android:title="@string/pref_title_add_friends_to_messages" /></PreferenceScreen>

SettingActivity.java

public class SettingsActivity extends AppCompatPreferenceActivity {
...@Override@TargetApi(Build.VERSION_CODES.HONEYCOMB)public void onBuildHeaders(List<Header> target) {loadHeadersFromResource(R.xml.pref_headers, target);}
...
@TargetApi(Build.VERSION_CODES.HONEYCOMB)public static class GeneralPreferenceFragment extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.pref_general);setHasOptionsMenu(true);// Bind the summaries of EditText/List/Dialog/Ringtone preferences// to their values. When their values change, their summaries are// updated to reflect the new value, per the Android Design// guidelines.bindPreferenceSummaryToValue(findPreference("example_text"));bindPreferenceSummaryToValue(findPreference("example_list"));}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();if (id == android.R.id.home) {startActivity(new Intent(getActivity(), SettingsActivity.class));return true;}return super.onOptionsItemSelected(item);}}
}

这样一个setting activity就可以工作了。

但是此类activity由于不使用普通的界面布局文件,我们无法在布局文件中添加自定以的控件。

比如我们想要在页面的底部添加一个任务栏,其实是无法简单的通过修改布局文件来增加的。

本文采用的方法是基于下面文章的思路来的。

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0331/1608.html

基本的思路是,在Setting Activity的onCreate方法中,截获之前布局树上的content元素,插入我们自定义的底部任务栏。

代码如下

SettingActivity.java

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setupActionBar();hookThebottomBar();BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);}private void hookThebottomBar(){ViewGroup content = (ViewGroup) findViewById(android.R.id.content);LayoutInflater.from(this).inflate(R.layout.com_bottombar, content, true);}

com_bottombar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"><android.support.design.widget.BottomNavigationViewandroid:id="@+id/navigation"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:background="?android:attr/windowBackground"app:menu="@menu/navigation" /></LinearLayout>

这里注意,我们拦截到的content其实是Framelayout,而我们的目标是添加一个底部任务栏,所以需要在上面的com_bottombar.xml设置 android:layout_gravity="bottom",这样这个我们后续添加的帧才不会覆盖之前的内容。

最后的效果图如下

为Android Studio中的SettingsActivity定制任务栏 (Setting Activity其实本质上是从PreferenceActivity中继承过来的)相关推荐

  1. hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...

    今天梦翔儿,成功实现hadoop编程,将本地文件夹中多个文件,合并为一个文件并上传到hdfs中 直接上代码:PutMerge.java import java.io.IOException; impo ...

  2. Android Studio 学习记录-图形定制

    目录 图形Drawable 形状图形 1.shape(形状) 2.size(尺寸) 3.stroke(描边) 4.corners(圆角) 5.solid(填充) 6.padding(间隔) 7.gra ...

  3. android过滤文件删除,Android Studio Git 过滤(忽略)和移除不必要上传的文件

    1.过滤不需要上传的文件 Android studio 项目中有文件.gitignore文件 内部例如:/.idea/ /.gradle/ /.settings/ /build/ .gitignore ...

  4. Android Studio制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。

    背景: 本文的内容是针对单片机蓝牙模块(HC-42)开发的手机App.在这之前,我想先声明一点,手机与手机间的蓝牙连接方式"与"手机与HC间的蓝牙连接方式"是不一样的.原 ...

  5. 在android Studio中设计app的底部导航栏

    准备工作 新建一个空白android项目 命名为csdn 在res/layout路径下设置主页面 使用线性布局 linearLayout 使用自定义的viewPager(切换多个页面会秒跳转,提升体验 ...

  6. html中把句子往右边弄一点咋办,CSS上的左,中,右对齐方法,可以在一行上混合...

    一种用CSS以左对齐/中心对齐/右对齐方式显示用HTML编写的句子的方法 在用"从左到右书写的语言"(如日语和英语)中编写的HTML中,除非指定了字符移位方向,否则句子左对齐显示. ...

  7. android studio gradle与gradle plugin version离线下载 从别的电脑上复制

    gradle plugin version下载 本地路径:C:\Users\FT\.gradle\caches\modules-2\files-2.1\com.android.tools.build\ ...

  8. 《Android App开发入门:使用Android Studio 2.X开发环境》——1-2 在计算机的仿真器上执行 App...

    1-2 在计算机的仿真器上执行 App

  9. Android studio报错:Could not identify launch activity: Default Activity not found

    报错内容: Could not identify launch activity: Default Activity not found Error while Launching activity ...

最新文章

  1. PyTorch 版 EfficientDet 比官方 TF 实现快 25 倍?这个 GitHub 项目数天狂揽千星
  2. gitlab+jenkins+maven+docker持续集成(四)——Extended E-mail Notification配置
  3. 专为SaaS而生的PaaS平台!
  4. bootstrap获取表格中选中行的值_这才是No.1的Excel表格核对技巧
  5. MyEclipse内存溢出问题
  6. linux ls 目录结构,linux 系统目录结构 ls命令 文件类型 alias命令
  7. 杀不死的人狼——我读《人月神话》(四)
  8. js排序算法详解-桶排序
  9. 国内五大主流网站内容抓取工具/采集软件大盘点
  10. 【微信支付】小案例,Java版
  11. cd linux自带系统安装,大神示范win7系统将CDLinux装入硬盘的法子
  12. pytorch自定义Dataset,torch加载自己的numpy数据集,torch-cnn训练numpy进行回归
  13. 大型在线考试答题系统源码 B/S架构
  14. Android实现视频播放的3种实现方式
  15. 常见分布式算法的介绍
  16. DEV、SIT、UAT、PET、SIM、PRD、PROD缩写介绍
  17. 2019压强投入,华为云“Cloud+X”打开产业下一极空间
  18. “仁、义、礼、智、信、忠、孝、节、勇、和”
  19. [Android]自定义垂直滚动的广告区
  20. 十、RISC-V SoC外设——timer定时器 代码讲解

热门文章

  1. CAN总线抗干扰的六种解决方案
  2. python自己的模块_Python--构建发布自己的模块
  3. 虚拟机架云服务器,云服务器 虚拟机架设
  4. mysql+多列外键_MySQL中的多列外键?
  5. eclipse maven项目 class类部署不到tomcat下_Spring Boot的两种部署方式:jar包和war包
  6. arduino i2c 如何写16位寄存器_Arduino之我见
  7. 华为漫画 | 什么是DSP?
  8. 最新 | 2018年无人机研发热点
  9. 基于FPGA的竞赛抢答器
  10. 中震弹性计算_众值烈度、中震烈度、大震烈度及三水准二阶段