模块界面如下:

字体类型选项:

由于此模块只为演示在Android 的应用开发中设置的功能,故此模块只是简单演示了阅读器的字体改变等操作,并未加入如更换壁纸、设置主题等操作,读者在看完本篇相信自己动手也可以把模块加入进去。并使用Android 提供的设置功能为您的应用程序加入方便易用的设置。

本功能涉及知识如下:

  • onActivityResult 回传值的使用
  • 设置界面的xml布局的使用

首先,让我们先来看看我们是怎么进入设置界面的

由上图,我们通过点击菜单的设置按钮,并跳转到设置界面,这里面我们要特别注意的是。由于我们做设置功能时,是希望用户在进入一番设置后回来的时候能够根据设置的内容做出相应的状态变化,这一步骤就要有一个顺序如:main->set->main 的关系,Android Activity 里面有一个相应的类就是做这种回调加载的工作的,具体我们可以右键--》source--》ovveride/Implement Methods 找到onActivityResult方法,点击生成方法体,如下:

不过一般我没有这样做,,比较浪费时间直接在code 空间输入on开头即可,如下:

通过上面的操作,生成完方法体之后,我们先放着,在code 空间上方声明一个请求代码,以供到时候回调做认证,这里我们声明一个常量做为标识其为请求设置的标记

private final int REQUEST_CODE_SET = 0x112;// 用于设置请求代码

点击菜单后的处理:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        int itemId = item.getItemId();
        switch (itemId) {
        case SET:
            Intent intent = new Intent(context, Set.class);
            startActivityForResult(intent, REQUEST_CODE_SET);
            return true;

Tip:这里必须使用 startActivityForResult 方法,否则回调时 onActivityResult 回调函数将无法获得请求。

设置界面的布局:

在res 目录下新建一个目录为xml 的文件下,在xml文件下新建一个名为:preference.xml 的xml文件,配置如下代码:

<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory android:title="@string/str_font">
        <ListPreference android:key="font_style" android:title="@string/str_fontstyle"
            android:dialogTitle="@string/str_fontstyle" android:entryValues="@array/fontstylevalue"
            android:dialogIcon="@drawable/chapter" android:entries="@array/fontstyle"></ListPreference>
        <com.terry.util.ColorPickerPreference
            android:key="colorpiker" android:persistent="true" android:summary="@string/app_name"
            android:dialogTitle="@string/str_fontscolor" android:title="@string/str_fontscolor" />
        <PreferenceScreen android:title="@string/str_fonttype">
            <Preference android:title="@string/app_name" android:key="app_name"></Preference>
            <CheckBoxPreference android:key="fonti"
                android:title="@string/str_fonti"></CheckBoxPreference>
            <CheckBoxPreference android:key="fontb"
                android:title="@string/str_fontb"></CheckBoxPreference>
            <CheckBoxPreference android:key="fontu"
                android:title="@string/str_fontu"></CheckBoxPreference>
        </PreferenceScreen>
        <PreferenceScreen android:title="@string/blog">

<intent android:action="android.intent.action.VIEW"
                android:data="http://www.cnblogs.com/terryblog" />
        </PreferenceScreen>

</PreferenceCategory>

</PreferenceScreen>

其中,com.terry.util.ColorPickerPreference 元素为自定义preference 元素,具体可以参考上一篇颜色选择器的代码。preference 界面和属性网上都有相关的解答,这里不做过多的解释,下面是设置后的结构图:

Tip:设置界面可以通过结构图可视化配置,如上图。

设置界面的完整代码如下:

package com.terry.eBook;

import android.content.Intent;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
import android.text.Html;
import android.view.KeyEvent;
import cn.itcreator.android.reader.paramter.CR;

public class Set extends PreferenceActivity {

Preference fonti;
    Preference fontb;
    Preference fontu;
    Preference app_name;
    boolean get1;
    boolean get2;
    boolean get3;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

fonti = findPreference("fonti");
        fontb = findPreference("fontb");
        fontu = findPreference("fontu");
        app_name = findPreference("app_name");

get1 = fonti.getSharedPreferences().getBoolean("fonti", false);
        get2 = fontb.getSharedPreferences().getBoolean("fontb", false);
        get3 = fontu.getSharedPreferences().getBoolean("fontu", false);
        final Preference colorpicker = findPreference("colorpiker");
        final Preference fontstyle = findPreference("font_style");

setTextType(app_name);
        OnPreferenceChangeListener onpre = new OnPreferenceChangeListener() {

@Override
            public boolean onPreferenceChange(Preference preference,
                    Object newValue) {
                // TODO Auto-generated method stub

if (preference == colorpicker) {
                    CR.textColor = String.valueOf(newValue);
                }
                if (preference == fontstyle) {
                    CR.textSize = Integer.parseInt(newValue.toString());
                }
                return true;
            }
        };
        fontstyle.setOnPreferenceChangeListener(onpre);
        colorpicker.setOnPreferenceChangeListener(onpre);
    }

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            CR.BOOKI = fonti.getSharedPreferences().getBoolean("fonti", false);
            CR.BOOKB = fontb.getSharedPreferences().getBoolean("fontb", false);
            CR.BOOKU = fontu.getSharedPreferences().getBoolean("fontu", false);
            Intent intent = new Intent(Set.this, eBookActivity.class);
            setResult(RESULT_OK, intent);
            finish();
            return false;
        }

return super.onKeyDown(keyCode, event);
    }

@Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        // TODO Auto-generated method stub
        String key = preference.getKey();
        if ("fonti".equals(key) || "fontb".equals(key) || "fontu".equals(key)) {
            setTextType(app_name);
        }
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

public void setTextType(Preference pre) {

get1 = fonti.getSharedPreferences().getBoolean("fonti", false);
        get2 = fontb.getSharedPreferences().getBoolean("fontb", false);
        get3 = fontu.getSharedPreferences().getBoolean("fontu", false);
        if (get1 == true && get2 == false && get3 == false) {
            pre.setTitle(Html.fromHtml("<i>"
                    + getResources().getString(R.string.app_name) + "</i>"));
        }
        if (get1 == false && get2 == false && get3 == false) {
            pre.setTitle(Html.fromHtml(getResources().getString(
                    R.string.app_name)));
        }
        if (get1 == true && get2 == true && get3 == false) {
            pre
                    .setTitle(Html.fromHtml("<i><b>"
                            + getResources().getString(R.string.app_name)
                            + "</b></i>"));
        }
        if (get1 == true && get2 == true && get3 == true) {
            pre.setTitle(Html.fromHtml("<i><b><u>"
                    + getResources().getString(R.string.app_name)
                    + "</u></b></i>"));
        }
        if (get1 == true && get2 == false && get3 == true) {
            pre
                    .setTitle(Html.fromHtml("<i><u>"
                            + getResources().getString(R.string.app_name)
                            + "</u></i>"));
        }
        if (get1 == false && get2 == true && get3 == false) {
            pre.setTitle(Html.fromHtml("<b>"
                    + getResources().getString(R.string.app_name) + "</b>"));
        }
        if (get1 == false && get2 == true && get3 == true) {
            pre
                    .setTitle(Html.fromHtml("<b><u>"
                            + getResources().getString(R.string.app_name)
                            + "</u></b>"));
        }
        if (get1 == false && get2 == false && get3 == true) {
            pre.setTitle(Html.fromHtml("<u>"
                    + getResources().getString(R.string.app_name) + "<u>"));
        }

}
}

Tip:如上代码,用户在点击按键返回时通过外部声明的一个静态类,然后调用setResult(RESULT_OK, intent)方法,将结果返回出去。CR文件如下:

package paramter;

public class CR {
    /** 中文的字体宽度 */
    public static int ChineseFontWidth = 16;
    /** 小写英文的字体宽度 */
    public static int upperAsciiWidth = 8;
    /** 大写英文的字体宽度 */
    public static int lowerAsciiWidth = 8;
    /** 行高 */
    public static int fontHeight = 16;
    /** 行距 */
    public static int lineSpace = 0;

/** 将要设置的文字颜色 */
    public static String textColor = "";

/** 将要设置的文字大小 */
    public static int textSize = 18;
    /** 书签位置 **/
    public static String BOOKMARKOFFSET;
    /** 书签百分比 */
    public static String BOOKMARKPERCENT;

// 下划线
    public static boolean BOOKU;

// 粗体
    public static boolean BOOKB;

// 斜体
    public static boolean BOOKI;

}

回到阅读界面,触发onActivityResult函数:

if (requestCode == REQUEST_CODE_SET && resultCode == RESULT_OK) 
{
    //改变字体的操作调用CR的常量改变当前的字体
}

到此设置功能结束。

转载于:https://blog.51cto.com/terryblog/394791

eBook 功能模块二之设置模块相关推荐

  1. python中的时间处理模块(二):datetime模块之timedelta类详解

    1.datetime模块   datatime模块是在time模块的基础之上做了封装,提供了更多更好用的类供我们使用,常用的有date.time.datetime.timedelta.tzinfo.但 ...

  2. 同时挂载二维码模块与4G模块时,导致4G模块连不上网都是USB设备)

    一.BUG现象 今天公司设备出现一个问题,在RK3399上的USB上插着三个设备,分别是4G模块.二维码模块与身份证模块,在这三个设备同时插在设备上时再开机,会出现4G模块连不上网络的情况,无论怎么插 ...

  3. CSDN VIP特权(添加自定义模块与域名设置)

    文章目录 一.自定义模块 二.域名设置 一.自定义模块 点击管理博客 选择自定义模块 添加标题和内容(自定,也可以参照下面的例子) 标题 good good study,day day up! 内容( ...

  4. python cx_oracle模块详解_cx_Oracle模块详解

    1.安装cx_Oracle模块 1-1.环境准备: 1-1-1.oracle client最小安装 instantclient-sqlplus-linux.x64-11.2.0.4.0 instant ...

  5. 嵌入式Linux设备驱动程序开发指南18(IIO子系统(二)具有硬件触发功能的IIO子系统ADC模块)——读书笔记

    IIO子系统二 具有硬件触发功能的IIO子系统ADC模块 十八.IIO子系统(二) 具有硬件触发功能的IIO子系统ADC模块 18.1 简介 18.2 设备树 18.3 硬件触发驱动功能分析 18.3 ...

  6. WPF仿网易云音乐系列(二、歌单创建窗口+登录设置模块)

    老衲牺牲午休时间写博客,都快把自己感动了,-_-!! 之前上一篇随笔,我看了下评论,有部分人说WPF已经凉凉了,这个我觉得,这只是一个达到自己目的的工具而已,只要自己能用这个工具,得心应手的做出自己想 ...

  7. 第三个python小功能完成后记录——二、必要模块函数记忆

    一.xlwings模块 1.打开工作簿.读取第一张工作表 wb = app.books.open('表.xls') ws = wb.sheets[0] 2.新建工作表.复制工作表 wb.add(nam ...

  8. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十二:串口模块① — 发送

    实验十二:串口模块① - 发送 串口固然是典型的实验,想必许多同学已经作烂,不过笔者还要循例介绍一下.我们知道串口有发送与接收之分,实验十二的实验目的就是实现串口发送,然而不同的是 ... 笔者会用另 ...

  9. Python学习 - 常用模块(二)

    目录 一. 常用模块 - hashlib 二. 常用模块 - hmac 三. 常用模块 - logging 四. 常用模块 - re 五. 常用模块 - requests 六. 常用模块 - para ...

最新文章

  1. 高清的GIF表情包如何制作
  2. 深入学习keepalived之一 keepalived的启动
  3. Android探索之旅 | 为应用添加角标(Badge)
  4. Hadoop工具如何形成SAP Hana的大数据平台
  5. Python模块和包
  6. 笔记一 Redis基础
  7. 软件工程和计科专业对比,哪一个更适合毕业做程序员?
  8. mediarecorder路径设置为localsocket_PR学习之旅:pr怎么才能定位和修改视频保存路径,操作很简单...
  9. 在 Pycharm 中安装 wxPython
  10. UJAM Virtual Guitarist SILK for mac(尼龙弦原声吉他)
  11. Makefile 教程(超详细)
  12. linux高通内核移植工具十教程
  13. 半监督学习和直推式学习
  14. windows10系统盘瘦身
  15. 《思维导图与识字教学》理论在教学实践中的应用
  16. Canvas绘制圆点线段
  17. Firmament - 大规模集群任务调度
  18. OllyDBG修改exe并保存运行
  19. 用python练习日语五十音图
  20. 做微信还是做APP:两种创业的不同风险

热门文章

  1. Ionic 存储目录 CORS
  2. 2016年CCPC/ICPC比赛总结
  3. 设计模式——创建型模式
  4. MongoDB的学习--聚合
  5. VC++ 6.0下OpengGL配置以及glut配置
  6. php获取文件名称和扩展名
  7. ASP.NET MVC 2 模型验证
  8. [转]VC6.0无法打开文件和无法向工程添加文件的解决办法
  9. VB 输入超出文件尾(错误62)(转)
  10. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列