模塊界面如下:
字體類型選項:
由於此模塊只為演示在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的常量改變當前的字體
}
到此設置功能結束。
轉自:http://www.cnblogs.com/TerryBlog/archive/2010/09/20/1831976.html